即使在卸载后,Universal App的手机版似乎也在缓存数据库

Mic*_*zoe 5 c# sqlite-net windows-phone-8.1 win-universal-app

我正在使用SQLite开发Universal App,我一直在使用本教程和SQLite for Windows Runtime(Windows Phone 8.1)和sqLite-net开始使用.

我用它来检查数据库是否存在:

bool exists = true;

try {
    var file = await ApplicationData.Current.LocalFolder.GetFileAsync( "database.db" );
} catch {
    exists = false;
}
Run Code Online (Sandbox Code Playgroud)

如果没有运行一些插入查询来填充默认数据:

if( !exists ) {
    var conn = new SQLiteConnection( "database.db );
    conn.CreateTable<MyClass>();
    MyClass.Insert( "Default data value" );
}
Run Code Online (Sandbox Code Playgroud)

MyClass的地方

[Table( "MyClass" )]
public class MyClass {
    public MyClass() {
        this.ID = -1;
        this.Name = string.Empty;
    }

    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    [NotNull]
    public string Name { get; set; }

    internal static void Insert( string Name ) {
        var myclass = new MyClass();
        myclass.Name = Name;

        var conn = new SQLiteConnection( "database.db" );

        try {
            if( myclass.ID == -1 ) conn.Insert( myclass );
        } catch { }
    }

    public async static Task<List<MyClass>> List() {
        var conn = new SQLiteAsyncConnection( "database.db" );
        var rs = conn.Table<MyClass>().OrderBy( t => t.ID );
        return await rs.ToListAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是每次我进行全新部署(从我的测试设备卸载后),并且代码正确地确定数据库不存在并执行插入,我留下了越来越多的记录.更具体地说,我正在插入四个默认值,但在我上次部署时,该表当前有124条记录(意味着我已经部署了31次)并查看数据,它重复了相同的四个值.逐步执行代码,正如预期的那样,只发生了四次插入.

好像数据库正在某处缓存.我运行Windows Phone Power Tools并验证卸载后没有文件.我在这里错过了什么吗?

小智 0

前段时间我也遇到过类似的问题(尽管不是使用 SQLite)。尝试选中 WMAppManifest.xml(打包选项卡)中的“禁用自动备份/恢复”复选框。

但一般来说,new SQLiteConnection( "database.db" );它本身并不能保证创建一个新文件,并且您的代码当前不能确保该文件不存在:您正在捕获所有异常,而您的条件仅被覆盖FileNotFoundException-GetFileAsync可能会因除以下原因之外的其他原因而失败文件不存在。我建议FileNotFoundException首先捕获异常,并且可能还可以在代码中显式创建文件。