libreria - room in android developer
¿Cómo llenar la tabla de la base de datos de Android Room en la primera ejecución? (4)
Intenté usar RoomDatabase.Callback como lo sugiere Arnav Rao, pero para usar una devolución de llamada no puede usar el DAO ya que la devolución de llamada se crea antes de que se haya creado la base de datos. Podrías usar db.insert y los valores de contenido, pero no pensé que eso hubiera sido correcto. Así que después de analizarlo un poco más, me demoré muchísimo, pero en realidad encontré la respuesta al analizar las muestras proporcionadas por Google.
Vea la línea 52 y el método en la línea 71 - Allí puede ver después de la creación de la instancia de la base de datos, la siguiente línea llama a un método que verifica si hay registros en la base de datos (usando el DAO) y luego, si está vacío Inserta los datos iniciales (nuevamente utilizando el DAO).
Espero que esto ayude a alguien más que estaba atascado :)
En SQLiteOpenHelper
hay un onCreate(SQLiteDatabase ...)
que utilicé para rellenar las tablas de la base de datos con algunos datos iniciales.
¿Hay alguna forma de insertar algunos datos en la tabla de la base de datos de la sala en la primera ejecución de la aplicación?
Probé varias maneras de hacer esto, cada una no disponible.
Primero, intenté agregar una implementación de Migración a la Sala utilizando el método ''addMigrations'', pero encontré que solo se ejecuta durante una actualización de la base de datos, pero no en la creación.
Luego, intenté pasar una implementación de SQLiteOpenHelper a la sala utilizando el método ''openHelperFactory''. Pero después de crear un montón de clases para sortear los modificadores de acceso a nivel de paquete de Room, abandoné el esfuerzo. También intenté subclasificar el FrameworkSQLiteOpenHelperFactory de Room pero, nuevamente, el modificador de acceso a nivel de paquete de su constructor no era compatible con esto.
Finalmente, creé un IntentService para llenar los datos y lo invocé desde el método onCreate de mi subclase de aplicación. El enfoque funciona, pero una solución mejor debería ser la próxima solución al problema del rastreador mencionado por Sinigami en otra parte de esta página.
Darryl
[Agregado el 19 de julio de 2017]
El problema parece que se resolvió en la sala 1.0.0. Alpha 5. Esta versión agregó una devolución de llamada a RoomDatabase que le permite ejecutar código cuando la base de datos se crea por primera vez. Echa un vistazo a:
https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback.html
Puede ejecutar scripts después de crear o ejecutar la base de datos cada vez que se abre la base de datos con RoomDatabase.Callback
, esta clase está disponible en la última versión de la biblioteca de Room.
onCreate
implementar el método onCreate
y onOpen
de RoomDatabase.Callback
y agregarlo a RoomDatabase.Builder
como se muestra a continuación.
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
}
};
Puede usar Room DAO en los métodos RoomDatabase.Callback para llenar la base de datos. Para ver ejemplos completos, vea Paginación y Ejemplo de habitación
RoomDatabase.Callback dbCallback = new RoomDatabase.Callback() {
public void onCreate(SupportSQLiteDatabase db) {
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
@Override
public void run() {
getYourDB(ctx).yourDAO().insertData(yourDataList);
}
});
}
};
@Provides
@Singleton
LocalDatabase provideLocalDatabase(@DatabaseInfo String dbName, Context context) {
return Room.databaseBuilder(context, LocalDatabase.class, dbName)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
db.execSQL("INSERT INTO id_generator VALUES(1, 1, 1);");
}
})
// .addMigrations(LocalDatabase.MIGRATION_1_2)
.build();
}