当前位置: 首页 > 知识库问答 >
问题:

重新安装应用程序时,旧数据会出现在SQLite数据库中

易星宇
2023-03-14

我有一个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之后,在运行更新的调试或发布构建后,毫无疑问,该表包含此过期令牌。然后,我可以注销并再次登录以刷新令牌,应用程序运行良好,新数据在应用程序的多次打开和关闭中正确保持不变。

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

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

  • 对应用程序进行了干净的构建(包括手动删除项目中的obj和bin文件夹)。
  • 选项中未选中在部署之间保留设备上的应用程序数据高速缓存-

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

此问题仅在最近几周内开始发生,可能是由于更新。在此之前,卸载该应用程序足以删除所有数据。

显然,尽管有搜索SQLite和Xamarin文档,但我不知道这些数据的某种额外缓存层,任何人都可以告诉我它是什么?

共有2个答案

陆阳曜
2023-03-14

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

宗冷勋
2023-03-14

根据@Common sware的评论,在中的AndroidManifest.xml中添加android: alloBackup="false"

来自Android文档:

android:allowBackup

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

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

 类似资料:
  • 根据文档,来自的room实例应该保存的数据是persist。但还是迷路了。我的项目必须数据库 第一个数据库 @database(实体=[foodmodel::class],version=4,exportSchema=false)抽象类FoodDatabase:RoomDatabase(){ 第二数据库 抽象类MyFoodDatabase:RoomDatabase(){abstract val M

  • Spring Boot版本为1.5.6 使用的数据库是SQL Server2016,它也是在docker(windows容器)上。 问题:每当我重新启动SQL DB容器时,应用程序开始给出这个错误。 任何想法可以做什么来解决这个问题。 多谢了。

  • 在开发一个针对4.1以上所有版本的Android应用程序时,我观察到卸载我的应用程序并重新安装它并不能清除它的数据。 我试图通过访问来确保数据库在卸载后消失了,而且确实该文件夹在卸载期间被删除了。 我试图删除应用程序通过访问设置页面,通过钛备份和结果是相同的。该设备是运行V6.0的根Nexus5。 这种奇怪行为的原因是什么?

  • 我在编码方面是新手,所以我复制粘贴了一些教程的代码,但是当我试图删除“睡眠”列中的所有数据时,出现了这个错误。 Android数据库sqlite。SQLiteException:在“20170128”附近:编译时出现语法错误(代码1)::在android上从20170128删除。数据库sqlite。SQLiteConnection。android上的nativePrepareStatement(本

  • 复制步骤:使用VS2012终极版(我相信任何版本也可以)创建一个类库项目,右键单击引用并管理nuget包。使用nuget包管理器,尝试安装System.数据。Sqlite(10.21.2015)最新版本。 我得到以下错误消息: 当然,如果我只安装“核心”包,它就可以工作。我不明白为什么我不能安装官方的完整包。

  • 所以,在我的开发Mac上使用我的rails应用程序创建了一个正常工作的postgres db实例,但是随着我从头开始构建模型(即添加、删除、更改列),迁移变得难以管理,所以我决定开始清理。运行rake db: dro后,我无法通过rake db: create重新创建。我只得到以下信息: 无法为 {“适配器”= 创建数据库 我想我需要在postgres中创建用户,但是它不应该从初始设置就存在吗?