此代码从Contacts
获取ContactsDB.db
的记录:
public async Task<List<Models.Contacts>> Read()
{
return await Task.Run(() =>
{
SQLiteConnection connection = new SQLiteConnection("ContactsDB.db");
return _contacts = new List<Models.Contacts>(connection.Table<Models.Contacts>());
});
}
这是SQLite工具箱已生成的Contacts
表的模型:
public partial class Contacts
{
[PrimaryKey]
[NotNull]
public String ID { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String PhoneNumber { get; set; }
public String PathToImage { get; set; }
public String Email { get; set; }
public Int64? IsFavorite { get; set; }
public Int64? GroupID { get; set; }
}
Screenshot of records from ContactsDB.
我已将ContactsDB
的Build Action参数更改为Content
,但这并没有改变情况。在过去,当我在连接字符串中写入DB名称而不等于DB名称本身时,会抛出该异常。此时,我将复制数据库名称,但会引发异常。
即使使用生成的模型和SQLite的容量,我也无法找到引发异常的原因。
答案 0 :(得分:0)
使用TableAttribute
确保表名与数据库中的表名完全匹配:
[Table("NameOfYourTableInDb")]
public partial class Contacts
{
...
}
此外,我认为您可能不小心在应用程序数据目录中创建了一个新数据库,如果您随项目一起部署只读数据库,则可能不是您想要的。要获取文件的正确路径,您将需要以下内容
var appDb = await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///ContactsDB.db"));
SQLiteConnection connection = new SQLiteConnection(appDb.Path);
ms-appx:///
指向应用程序安装目录的根。
但是,如果还需要修改数据库中的数据,则必须首先将数据库文件复制到应用程序数据目录中:
StorageFile dbFile = null;
try
{
dbFile = await ApplicationData.Current
.LocalFolder.GetFileAsync("ContactsDB.db");
}
catch (Exception)
{
//file does not exist
}
if (dbFile == null)
{
//copy db deployed with app
var appDb = await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///ContactsDB.db"));
dbFile = await appDb.CopyAsync(
ApplicationData.Current.LocalFolder);
}
SQLiteConnection connection = new SQLiteConnection(dbFile.Path);
//same as "ContactsDB.db"
在这种情况下,我首先检查数据库是否尚未复制,如果尚未复制,则将随应用程序一起部署的只读数据库复制到应用程序的本地存储(即可读写)。请注意,我也可以直接使用"ContactsDB.db"
作为连接字符串,因为这将假定为ApplicationData.Current.LocalFolder
工作目录。但是,为了更清楚起见,我使用了dbFile.Path
。