在SQLiteOpenHelper
有一个onCreate(SQLiteDatabase ...)
方法,我用它用一些初始数据填充数据库表。如何在首次运行时填充Android Room数据库表?
有没有办法将一些数据插入到第一个 应用程序运行的房间数据库表中?
在SQLiteOpenHelper
有一个onCreate(SQLiteDatabase ...)
方法,我用它用一些初始数据填充数据库表。如何在首次运行时填充Android Room数据库表?
有没有办法将一些数据插入到第一个 应用程序运行的房间数据库表中?
解决方案是实现捆绑到Android中的“SharedPreferences”。
下面的代码是基于从溶液:Check if application is on its first run
public class MyActivity extends Activity {
SharedPreferences prefs = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE);
...
}
@Override
protected void onResume() {
...
if (prefs.getBoolean("firstrun", true)) {
// !DO YOUR DATABASE INSERT/POPULATION HERE!
prefs.edit().putBoolean("firstrun", false).commit();
}
...
}
}
但更好的解决方案是在数据库创建后填充数据,而不是添加此标志。所以我敦促明星此功能请求https://issuetracker.google.com/issues/62699324 – Sinigami
我尝试了许多方法可以做到这一点,每个没有提供。
首先,我尝试使用'addMigrations'方法向Room中添加Migration实现,但发现它只在数据库升级期间运行,但不在创建时运行。
然后,我尝试使用'openHelperFactory'方法将SQLiteOpenHelper实现传递给Room。但是为了避开Room的包级访问修饰符而创建了一堆类之后,我放弃了这一努力。我也尝试了继承Room的FrameworkSQLiteOpenHelperFactory,但是,它的构造函数的包级访问修饰符不支持这一点。
最后,我创建了一个IntentService来填充数据,并从我的Application子类的onCreate方法中调用它。该方法可行,但更好的解决方案应该是即将解决此页面上其他地方Sinigami提到的跟踪问题。
达里尔
[增加了2017年7月19日]
问题看起来好像在1.0.0房解决。 Alpha 5.此版本向RoomDatabase添加了一个回调函数,使您可以在数据库第一次创建时执行代码。看一看:
https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback.html
创建数据库后,您可以运行脚本或运行的每个数据库使用RoomDatabase.Callback打开时,这个类是在房间库的最新版本。
您需要实现RoomDatabase.Callback的onCreate和onOpen方法,并将其添加到RoomDatabase.Builder,如下所示。
yourDatabase = Room.databaseBuilder(context,
YourDatabase.class, "your db").addCallback(rdc).build();
RoomDatabase.Callback rdc = new RoomDatabase.Callback(){
public void onCreate (SupportSQLiteDatabase db){
// do something after database has been created
}
public void onOpen (SupportSQLiteDatabase db){
//do something every time database is open
}
};
参考:https://medium.com/@srinuraop/database-create-and-open-callbacks-in-room-7ca98c3286ab
这一个应该被标记为正确的答案。谢谢! – Imanol
你可以提供预填充的数据库。并在那个工作。 –