【问题标题】:Remove room database on app uninstall卸载应用程序时删除房间数据库
【发布时间】:2018-09-15 13:54:03
【问题描述】:

我正在制作一个应用程序,我正在使用 Android Room Persistence 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 意图让我的应用程序知道卸载。我想知道的是,是否有databasebuilder 的配置可以完成这项工作,以及应用程序卸载后数据库如何持续存在。

【问题讨论】:

标签: android android-room


【解决方案1】:

是否有完成这项工作的数据库构建器的配置

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

app卸载后数据库怎么还存在

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

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

这也备份了你的房间数据库。

如何禁用自动备份

在您的清单中:

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

【讨论】:

  • 不应该从设置中关闭备份有同样的效果吗?
  • @Sam 我没有对此进行测试,但从文档developer.android.com/guide/topics/data/… 看来,关闭备份只会阻止新备份上传到谷歌驱动器,但不会阻止应用程序下载和恢复现有备份从谷歌驱动器。您的应用可能已经在 Google Drive 中存在备份。
  • 好吧有道理。以及如何仅针对特定应用删除来自谷歌驱动器的备份?
  • @Sam "如何仅针对特定应用从谷歌驱动器中删除备份" 您应该为此创建一个单独的问题。
【解决方案2】:
  1. 让您的应用程序卸载感知如 AnniJais 中的 answer 中所述。
  2. 在 Dao 中使用 @Query 注解创建一个删除数据库的方法。
@Query("Drop Database myDatabaseName")
public void nukeDatabase();
  1. 在之前添加的部分调用你的 Dao 方法:

if (activityName.equals("com.android.packageinstaller.UninstallerActivity")) { // User has clicked on the Uninstall button under the Manage Apps settings

第 2 步并不是我真正的测试者。

【讨论】:

  • 你能详细说明你的第二步吗? AFAIK @Delete 用于从表中删除数据,而不是数据库本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2019-03-20
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
相关资源
最近更新 更多