即使数据库内容记录和代码中使用生成的模型,也不会抛出该表

时间:2019-01-08 13:47:44

标签: c# sqlite uwp

此代码从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的容量,我也无法找到引发异常的原因。

1 个答案:

答案 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