重新安装应用程序时,旧数据显示在SQLite数据库中

时间:2017-04-30 21:37:47

标签: android sqlite xamarin.forms

我有一个Xamarin Forms应用程序,它使用SQLite数据库来存储用户数据,包括我用于使用REST API进行身份验证的登录令牌。

我在Android上遇到一个奇怪的问题,即通过在Visual Studio中重新部署应用程序来更新应用程序会导致SQLite数据库中的数据恢复为旧版本(它始终是相同的旧数据)。

我在SQLiteConnection内打开DependencyService,如下所示:

public SQLite.Net.SQLiteConnection GetConnection()
    {
        var sqliteFilename = "mydatabase.db3";
        string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // Documents folder
        var path = Path.Combine(documentsPath, sqliteFilename);

        var platform = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
        var conn = new SQLite.Net.SQLiteConnection(platform, path);

        // Return the database connection 
        return conn;
    }

登录令牌存储在数据库中只包含一行(当前登录用户)的表中。

打开数据库并读出此令牌实际上是我在App.xaml.cs中做的第一件事,在调用InitializeComponent之后,并且在运行更新的Debug或Release构建之后,确实没有失败,表格包含这个过时的令牌。然后我可以注销并再次登录以刷新令牌,应用程序正常工作,新数据在应用程序的多次打开和关闭时正确保留。

我的问题是这个过时令牌来自哪里?

我试图阻止它出现的一些事情:

  • 干净地构建了应用程序(包括手动删除项目中的obj和bin文件夹)。
  • 未选中“在部署之间保留设备上的应用程序数据缓存”选项 - > Xamarin - > Visual Studio中的Android设置
  • 从设备中卸载了该应用。由于数据库存储在System.Environment.SpecialFolder.Personal文件夹(对应/data/user/0/com.example.myapp/files/mydatabase.db3)中,因此据我所知,这应该擦除数据库。
  • 更新至最新版本的Xamarin Forms(2.3.4.231)和Xamarin(4.4.0.34)。 SQLite库等都是最新的。

我的应用程序中只有一个地方我将令牌插入数据库(当用户登录时)并且我将其记录到控制台,并且我的应用程序肯定没有将旧令牌重新插入数据库。我的项目中没有包含此数据的db3文件。无论如何它会如何到达那里?

此问题仅在过去几周内开始,可能是由于更新。在此之前,卸载应用程序就足以清除所有数据。

显然有一些额外的数据缓存层,我不知道尽管在搜索SQLite和Xamarin文档时,有人能告诉我它是什么吗?

2 个答案:

答案 0 :(得分:4)

根据@Commonsware的评论,将android:allowBackup="false"添加到AndroidManifest.xml标记中的<application>会阻止旧数据的恢复。

来自Android docs

  

<强>机器人:allowBackup

     

是否允许应用程序参与备份和还原基础结构。如果此属性设置为false,则不会执行应用程序的备份或还原,即使是全系统备份也会导致所有应用程序数据都通过adb保存。 此属性的默认值为true。

我仍然不清楚为什么对当前安装的应用进行调试部署会触发从备份恢复事件。

答案 1 :(得分:0)

实际上为什么要在SQLite表中存储令牌?您可以使用https://www.nuget.org/packages/Xam.Plugins.Settings/来存储令牌。