在app uninstall上删除房间数据库

时间:2018-04-05 16:43:25

标签: 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;
    }
}

修改 我知道我可以使用ACTION_PACKAGE_REMOVED意图使我的应用程序了解卸载。我想知道的是,是否有databasebuilder的配置来完成这项工作,以及在卸载应用程序后数据库是如何存在的。

2 个答案:

答案 0 :(得分:8)

  

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

AFAIK会议室不知道应用程序是否正在卸载,因此Room可能不会在卸载时为您擦除数据库。

  

应用程序卸载后数据库如何保持

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

  • 共享偏好设置文件。
  • 保存到应用内部存储的文件,由getFilesDir()或getDir(String,int)访问。
  • getDatabasePath(String)返回的目录中的文件,其中还包含使用SQLiteOpenHelper类创建的文件。
  • getExternalFilesDir(String)返回的目录中的外部存储上的文件。

此备份您的房间数据库。

如何停用自动备份

在你的清单中:

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

答案 1 :(得分:0)

  1. 让您的应用程序卸载与answer中的AnniJais中所述相同。
  2. 使用删除数据库的@Query Annotation在Dao中创建一个方法。
  3. @Query("Drop Database myDatabaseName")
    public void nukeDatabase();
    
    1. 在之前添加的部分中调用您的Dao方法:
    2.   

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

      第2步对我来说并不是真的。