【问题标题】:Old data appears in SQLite database when reinstalling app重新安装应用程序时,旧数据出现在 SQLite 数据库中
【发布时间】:2017-09-28 10:11:57
【问题描述】:

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

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

我像这样在DependencyService 中打开SQLiteConnection

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 文档,但我不知道这些数据显然有某种额外的缓存层,谁能告诉我它是什么?

【问题讨论】:

  • 我不能代表 Xamarin,但从纯 Android 的角度来看,您可能在清单中的 <application> 上有 android:allowBackup="true",在这种情况下,操作系统可能会从备份中恢复您的数据。
  • @CommonsWare 谢谢,就是这样!我设置了android:allowBackup="false",卸载应用程序后旧数据停止返回。不幸的是,我在创建表时在System.Attribute.InternalGetCustomAttributes 内的 SQLite 中发生了崩溃,但这是我可以研究的另一个问题。希望 Xamarin Forms 应用不需要将 allowBackup 设置为 true。
  • @samgak,我建议你添加这个作为答案。 Xamarin (Forms) 不需要设置特定的 allowBackup 值。
  • @TimKlingeleers 完成。您知道为什么会触发此从备份还原吗?即使在对应用程序进行正常的调试部署时也会发生这种情况,而无需先卸载它。
  • 目前没有线索。也许应该在删除并重新安装应用程序后加载备份?有空我会试着研究一下。

标签: android sqlite xamarin.forms


【解决方案1】:

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

来自Android docs

android:allowBackup

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

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

【讨论】:

  • 我看到它在新添加的行上恢复发行版安装的 sqlite 数据库。我不明白 Google 为什么选择这样做。
【解决方案2】:

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

【讨论】:

  • 感谢您的链接,但我也存储了很多其他的东西。只是令牌是我读出的第一件事,所以我确定它没有被我的应用程序覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2020-10-05
相关资源
最近更新 更多