在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
你可以提供預填充的數據庫。並在那個工作。 –