android - 在应用程序卸载时删除房间数据库

标签 android android-room

我正在制作一个应用程序,我正在使用 Android Room Persistence Library 来处理我的数据库层。 Room Library 很有魅力,一切都很好。但我希望在用户卸载应用程序时删除房间创建的数据库。我尝试卸载应用程序然后重新安装,但不知何故数据库仍然存在并且应用程序能够从中获取旧数据。

我想可能是因为我的应用程序数据备份在设置中设置为自动,而 android 正在将其备份到云端并再次将其恢复,但从设置中关闭备份没有帮助。即使这样做对我来说听起来也不是一个好的解决方案。

我创建了一个非常简单的类,它扩展了 RoomDatabase,下面是有助于回答问题的代码。

我知道我可以在数据库构建器上使用 fallbackToDestructiveMigration() 并增加数据库版本。它将清除数据库中的数据。那不是我想要的。

@Database(entities = {UnleashedEntity.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract DaoContract MyDao();

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "user-database")
                            .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

编辑 我知道我可以使用 ACTION_PACKAGE_REMOVED Intent 让我的应用知道卸载。我想知道的是,是否有 databasebuilder 的配置可以完成这项工作,以及数据库如何在应用程序卸载后仍然存在。

最佳答案

Is there a configuration of the databasebuilder that does the job

AFAIK room 不知道应用程序正在卸载,因此 Room 可能不会在卸载时为您删除数据库。

How come the database persists after app uninstall

从 Android 6.0(API 级别 23)开始,Android 提供了 Auto Backup默认启用的功能。根据文档,它将以下内容备份到谷歌驱动器:

  • 共享首选项文件。
  • 保存到应用内部存储的文件,可通过 getFilesDir() 或 getDir(String, int) 访问。
  • getDatabasePath(String) 返回的目录中的文件,其中还包括使用 SQLiteOpenHelper 类创建的文件。
  • getExternalFilesDir(String) 返回的目录中的外部存储文件。

这也会备份您的房间数据库。

如何禁用自动备份

在您的 list 中:

<manifest ... >
    ...
    <application android:allowBackup="false" ... >
        ...
    </application>
</manifest>

关于android - 在应用程序卸载时删除房间数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49677497/

相关文章:

Android Room - 类型转换器在实体字段范围内不工作

android - 就像房间持久性库中区分大小写一样

android - BottomNavigationView 与导航图再次加载 fragment

java - 更有效地读取按字母顺序排序的文本文件

android - Google Identity Toolkit 返回 CONFIGURATION_NOT_FOUND

java - 在 Android 中使用 Room 和 RxJava 链接多个网络调用和数据库插入

java - 将 Room 持久性库与 sqlite 一起使用

android - 如何将数据从 webview 传回原生 Android 应用

android - 如何在 GridView 中高亮显示某个元素?

java - 如何同步查询房间数据库数据?