【发布时间】: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