SQLiteOpenHelper
には、onCreate(SQLiteDatabase ...)
メソッドがあります。これを使用して、データベーステーブルに初期データを設定しています。最初に実行したときにAndroidルームデータベーステーブルを読み込む方法は?
最初に アプリを実行してルームデータベーステーブルにデータを挿入する方法はありますか?
SQLiteOpenHelper
には、onCreate(SQLiteDatabase ...)
メソッドがあります。これを使用して、データベーステーブルに初期データを設定しています。最初に実行したときにAndroidルームデータベーステーブルを読み込む方法は?
最初に アプリを実行してルームデータベーステーブルにデータを挿入する方法はありますか?
解決策は、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のパッケージレベルのアクセス修飾子を取得するためにクラスをたくさん作成した後、私はその努力を断念しました。また、ルームのFrameworkSQLiteOpenHelperFactoryをサブクラス化しようとしましたが、コンストラクタのパッケージレベルのアクセス修飾子がこれをサポートしていませんでした。
最後に、データを生成するためのIntentServiceを作成し、それをアプリケーションサブクラスのonCreateメソッドから呼び出しました。アプローチは機能しますが、このページの他の場所でSinigamiが言及したトラッカーの問題に対する今後の修正が、より良い解決策になるはずです。
ダリル
[2017年7月19日を追加しました]
それはルーム1.0.0で解決だかのような問題が見えます。 Alpha 5.このリリースでは、データベースが最初に作成されたときにコードを実行できるコールバックがRoomDatabaseに追加されました。見てみましょう:あなたは、データベースがRoomDatabase.Callbackを使用して開くたびにデータベースを作成した後にスクリプトを実行したり、実行することができます
https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback.html
、このクラスは、ルームライブラリの最新バージョンで利用可能です。
次のように、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
あなたが事前にデータベースを提供することができます。それに取り組む。 –