在app uninstall上删除房间数据库

Sam*_*Sam 11 android android-room

我正在制作一个应用程序,我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 我知道我可以使用ACTION_PACKAGE_REMOVED意图让我的应用程序知道卸载.我想知道的是,是否有配置databasebuilder可以完成工作,以及数据库在卸载后如何保留.

Wei*_*zhi 12

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

AFAIK房间不知道应用程序正在卸载所以Room可能不会在卸载时为您擦除数据库.

为什么数据库在卸载应用程序后仍然存在

从Android 6.0(API级别23)开始,Android提供默认启用的自动备份功能.根据文件,它备份以下谷歌驱动器:

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

这也备份你的房间数据库.

如何禁用自动备份

在你的清单中:

<manifest ... >
    ...
    <application android:allowBackup="false" ... >
        ...
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)


Byt*_*wks 0

  1. 让您的应用程序卸载意识如AnniJais答案中所述。
  2. 在 Dao 中使用 @Query 注解创建一个删除数据库的方法。
@Query("Drop Database myDatabaseName")
public void nukeDatabase();
Run Code Online (Sandbox Code Playgroud)
  1. 在之前添加的部分中调用您的 Dao 方法:

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

第2步并不是对我的真正考验。