我试图在首次安装时从资产数据库初始化我的应用程序的数据库。但是,在应用程序关闭之前它可以正常工作。当我再次打开应用程序时,它会调用createFromAsset()
. 据我所知,问题在于我正在获取应用程序数据库的实例并使用资产数据库重写它。createFromAsset()
仅当应用程序第一次安装时才需要调用我。
@Database(entities = {ActivitySession.class}, exportSchema = true, version = 1)
public abstract class ActivityPackageDatabase extends RoomDatabase {
private static ActivityPackageDatabase INSTANCE;
public static ActivityPackageDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (ActivityPackageDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
ActivityPackageDatabase.class, "appDB")
.createFromAsset("database/assetDB.db")
.fallbackToDestructiveMigration()
.build();
}
}
}
return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
以防万一有实体和 DAO 的示例
@Entity
public class SessionPhoto {
@PrimaryKey(autoGenerate = true)
public long id;
public long sessionId;
public String path; …
Run Code Online (Sandbox Code Playgroud) java orm android android-room android-room-prepackageddatabase
在我的应用程序中,我使用带有预填充数据库的 Room,myDatabase.db
然后使用以下代码访问该数据库:
private val database = Room
.databaseBuilder(context.applicationContext, AppDatabase::class.java, dbName)
.createFromAsset("myDatabase.db")
.build()
Run Code Online (Sandbox Code Playgroud)
该文件myDatabase.db
存储在 /assets/ 文件夹中。然后我必须在这样的数据库中的表中添加一些新行。之后,我得到了一个更新的myDatabase.db
文件,我将其复制到 /assets/ 文件夹中替换旧文件。问题来了:安装应用程序后,它仍然使用旧数据。我做了一些搜索,但只找到了与迁移相关的结果。但是,就我而言,表的架构没有变化,只添加了一些新行。此外,我不明白为什么该应用程序不选择新myDatabase.db
文件而仍然使用旧文件。
让应用程序使用新文件的唯一解决方案myDatabase.db
是卸载应用程序,然后再次安装,但这是我想避免的事情。那么,如何更改myDatabase.db
assets文件夹中的文件并让应用程序通过Room选择新文件中的数据?
android android-assets android-room android-room-prepackageddatabase