我有一个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构建之后,确实没有失败,表格包含这个过时的令牌。然后我可以注销并再次登录以刷新令牌,应用程序正常工作,新数据在应用程序的多次打开和关闭时正确保留。
我的问题是这个过时令牌来自哪里?
我试图阻止它出现的一些事情:
System.Environment.SpecialFolder.Personal
文件夹(对应/data/user/0/com.example.myapp/files/mydatabase.db3
)中,因此据我所知,这应该擦除数据库。我的应用程序中只有一个地方我将令牌插入数据库(当用户登录时)并且我将其记录到控制台,并且我的应用程序肯定没有将旧令牌重新插入数据库。我的项目中没有包含此数据的db3文件。无论如何它会如何到达那里?
此问题仅在过去几周内开始,可能是由于更新。在此之前,卸载应用程序就足以清除所有数据。
显然有一些额外的数据缓存层,我不知道尽管在搜索SQLite和Xamarin文档时,有人能告诉我它是什么吗?
答案 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/来存储令牌。