在Windows Phone 8.1类库中创建SQLite数据库
我有一个Windows Phone 8.1类库,我想稍后添加它作为Windows Phone 8.1 App项目的参考。
该ClassLibrary应负责创建和管理自己的数据库。 我尝试在我的ClassLibrary中创建一个新的SQLiteConnection
,但它抛出以下错误: A first chance exception of type 'System.InvalidOperationException' occurred in SQLitePCL.DLL
中A first chance exception of type 'System.InvalidOperationException' occurred in SQLitePCL.DLL
但是,如果我在我的MainApp中执行相同的操作,一切正常。
那么,是否可以在ClassLibrary中创建一个SQLite数据库,该类库负责在没有MainApp支持的情况下创建和管理它。
我有一个项目,其中SQLite库在类库中,然后我使用另一个类库进行我的应用程序和SQLite库之间的通信
类库:SQLite.Library
- 创建一个新的类库(在我的例子中,我将其命名为SQLite.Library)
- 右键单击>管理NuGet包> sqlite-net( https://www.nuget.org/packages/sqlite-net/1.0.8 )
添加此NuGet包后,您会看到您的类库有2个新类:SQLite.cs和SQLiteAsync.cs。
SQLite和线程也有一个已知的问题( 当页面加载时出现NullReferenceException ),您可以通过在SQLite.cs中的方法TableMapping GetMapping
中添加一个锁来修复它:
public TableMapping GetMapping(Type type, CreateFlags createFlags = CreateFlags.None) { if (_mappings == null) { _mappings = new Dictionary (); } lock (_mappings) { TableMapping map; if (!_mappings.TryGetValue(type.FullName, out map)) { map = new TableMapping(type, createFlags); _mappings[type.FullName] = map; } return map; } }
类库:Solutionname.Lib
- 创建一个新的类库(在我的例子中,我将其命名为Solutionname.Lib)
- 右键单击>添加引用>解决方案> SQLite.Library(刚刚创建的类库)
设置引用后,您可以在此类库中使用SQLite库。
在我的项目中,我尝试分解我的代码,所以我开始创建一个名为DatabaseHelper.cs的类:
public class DatabaseHelper { private String DB_NAME = "DATABASENAME.db"; public SQLiteAsyncConnection Conn { get; set; } public DatabaseHelper() { Conn = new SQLiteAsyncConnection(DB_NAME); this.InitDb(); } public async void InitDb() { // Create Db if not exist bool dbExist = await CheckDbAsync(); if (!dbExist) { await CreateDatabaseAsync(); } } public async Task CheckDbAsync() { bool dbExist = true; try { StorageFile sf = await ApplicationData.Current.LocalFolder.GetFileAsync(DB_NAME); } catch (Exception) { dbExist = false; } return dbExist; } private async Task CreateDatabaseAsync() { //add tables here //example: await Conn.CreateTableAsync(); } }
在创建DatabaseHelper类之后,您可以首先为数据库中的每个表创建一个数据源类。 在我的情况下,我有一个CommentDataSource.cs :
public class CommentDataSource { private DatabaseHelper db; public CommentDataSource(DatabaseHelper databaseHelper) { this.db = databaseHelper; } public async Task AddComment(String vat, String comment) { long id = 0; DateTime date = DateTime.Now; DbComment dbc = new DbComment(vat, comment, date); await db.Conn.InsertAsync(dbc); DbComment insertDbc = await db.Conn.Table().ElementAtAsync(await db.Conn.Table ().CountAsync() - 1); if (insertDbc != null) { id = insertDbc.Id; } return id; } public async void RemoveComment(long idComment) { DbComment comment = await db.Conn.Table ().Where(c => c.Id == idComment).FirstOrDefaultAsync(); if (comment != null) { await db.Conn.DeleteAsync(comment); } } public async Task> FetchAllComments(String vat) { return await db.Conn.Table ().Where(x => x.VAT == vat).ToListAsync(); } }
如您所见,您将添加的所有数据源将使用相同的databasehelper。
在您的应用中使用Solutionname.Lib
- 右键单击>添加引用>解决方案> SQLite.Library(刚刚创建的类库)
- 右键单击>添加引用>解决方案> Solutionname.Lib
您仍然需要添加对sqlite lib的引用,否则您将收到错误。
现在你可以开始使用你的数据源类了,你可以在这里看到:
private DatabaseHelper db = new DatabaseHelper(); private CommentDataSource commentDataSource; public MainPage() { this.InitializeComponent(); commentDataSource = new CommentDataSource(db); }
现在,您的应用中可以使用CommentsDataSource的每个方法。
希望这对你有所帮助!
试试这个
public async Task CheckDbAsync(string dbName) { bool dbExist = true; try { StorageFile sf = await ApplicationData.Current.LocalFolder.GetFileAsync(dbName); } catch (Exception) { dbExist = false; } return dbExist; } public async Task CreateDatabaseAsync(string dbName) { SQLiteAsyncConnection con = new SQLiteAsyncConnection(dbName); await con.CreateTableAsync(); // await con.CreateTableAsync(); await con.CreateTableAsync(); // await con.CreateTableAsync(); }
并使用这样的
DataBaseOperation databaseoperation = new DataBaseOperation(); bool existDb = await databaseoperation.CheckDbAsync("sample.db"); // Check Database created or not if (!existDb) { await databaseoperation.CreateDatabaseAsync("sample.db"); // Create Database }