在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.DLLA first chance exception of type 'System.InvalidOperationException' occurred in SQLitePCL.DLL但是,如果我在我的MainApp中执行相同的操作,一切正常。

那么,是否可以在ClassLibrary中创建一个SQLite数据库,该类库负责在没有MainApp支持的情况下创建和管理它。

我有一个项目,其中SQLite库在类库中,然后我使用另一个类库进行我的应用程序和SQLite库之间的通信

类库:SQLite.Library

  1. 创建一个新的类库(在我的例子中,我将其命名为SQLite.Library)
  2. 右键单击>管理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

  1. 创建一个新的类库(在我的例子中,我将其命名为Solutionname.Lib)
  2. 右键单击>添加引用>解决方案> 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

  1. 右键单击>添加引用>解决方案> SQLite.Library(刚刚创建的类库)
  2. 右键单击>添加引用>解决方案> 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 }