2017-06-22 68 views
7

SQLiteOpenHelper有一個onCreate(SQLiteDatabase ...)方法,我用它用一些初始數據填充數據庫表。如何在首次運行時填充Android Room數據庫表?

有沒有辦法將一些數據插入到第一個 應用程序運行的房間數據庫表中?

+0

你可以提供預填充的數據庫。並在那個工作。 –

回答

-3

解決方案是實現捆綁到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(); 
     } 
     ... 
    } 
} 
+1

但更好的解決方案是在數據庫創建後填充數據,而不是添加此標誌。所以我敦促明星此功能請求https://issuetracker.google.com/issues/62699324 – Sinigami

5

我嘗試了許多方法可以做到這一點,每個沒有提供。

首先,我嘗試使用'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

17

創建數據庫後,您可以運行腳本或運行的每個數據庫使用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

+0

這一個應該被標記爲正確的答案。謝謝! – Imanol

相關問題