Utilizando más de 1 base de datos en Greendao con 2 esquemas diferentes – Android

Tengo 2 bases de datos en el proyecto, una de ellas creada cuando abro la aplicación, la otra se proporciona con los recursos.

Cuando DaoSession se genera el DaoSession se crea para todos los modelos.

También el esquema en el archivo gradle se utiliza para ambas bases de datos

¿Cómo puedo diferenciar entre las 2 bases de datos y sus esquemas?

Necesita crear dos clases diferentes que se extienden org.greenrobot.greendao.database.DatabaseOpenHelper . Estas dos clases diferentes DevOpenHelperForDatabase1 y DevOpenHelperForDatabase2 manejarán db realted I / o. Es versy fácil de entender a partir del siguiente código para crear dos bases de datos diferentes con el mismo y diferente esquema o tabla o entidades:

 public class App extends Application { private DaoSessionForDatabase1 mDaoSessionForDatabase1; private DaoSessionForDatabase2 mDaoSessionForDatabase2; @Override public void onCreate() { super.onCreate(); //Create Doa session for database1 DevOpenHelperForDatabase1 devOpenHelperForDatabase1 = new DevOpenHelperForDatabase1(this, "database1-db"); Database databse1 = devOpenHelperForDatabase1.getWritableDb(); mDaoSessionForDatabase1 = new DaoMasterForDatabase1(databse1).newSession(); //Create Doa session for database2 DevOpenHelperForDatabase2 devOpenHelperForDatabase2 = new DevOpenHelperForDatabase2(this, "database2-db"); Database databse2 = devOpenHelperForDatabase2.getWritableDb(); mDaoSessionForDatabase2 = new DaoMasterForDatabase2(databse2).newSession(); } public DaoSessionForDatabase1 getDaoSessioForDatabase1() { return mDaoSessionForDatabase1; } public DaoSessionForDatabase2 getDaoSessioForDatabase2() { return mDaoSessionForDatabase2; } } 

Puede acceder al mismo y al esquema oa la tabla o entidades diferentes como abajo de Actividad como ejemplo:

 // get the Schema1 DAO for Database1 DaoSessionForDatabase1 daoSessionForDatabase1 = ((App) getApplication()).getDaoSessioForDatabase1(); Schema1Dao schema1Dao = daoSessionForDatabase1.getSchema1Dao(); // get the Schema2 DAO for Database2 DaoSessionForDatabase2 daoSessionForDatabase2 = ((App) getApplication()).getDaoSessioForDatabase2(); Schema2Dao schema2Dao = daoSessionForDatabase2.getSchema2Dao(); 

Actualización 2 :: Lo anterior puede ser descartado, pero aún así la idea será la misma. Actualización hecha basada en la discusión en los comentarios a continuación:

Hice los cambios en el ejemplo greenDAO -> ejemplos

 package org.greenrobot.greendao.example; import android.app.Application; import org.greenrobot.greendao.database.Database; import org.greenrobot.greendao.example.DaoMaster.DevOpenHelper; public class App extends Application { /** A flag to show how easily you can switch from standard SQLite to the encrypted SQLCipher. */ public static final boolean ENCRYPTED = true; private DaoSession daoSession; private DaoSession daoSession1; @Override public void onCreate() { super.onCreate(); DevOpenHelper helper = new DevOpenHelper(this, ENCRYPTED ? "notes-db-encrypted" : "notes-db"); Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb(); daoSession = new DaoMaster(db).newSession(); DevOpenHelper helper1 = new DevOpenHelper(this, "notes1-db"); Database db1 = helper1.getWritableDb(); daoSession1 = new DaoMaster(db1).newSession(); } public DaoSession getDaoSession() { return daoSession; } public DaoSession getDaoSession1() { return daoSession1; } } 

Ahora haga los siguientes chnages en NoteActivity.java

 //Add below class members private static boolean switchDbBetweenOneAndTwo = false; private NoteDao noteDao2; private Query<Note> notesQuery2; //In on craete add the following as the last statement after notesQuery = noteDao.queryBuilder().orderAsc(NoteDao.Properties.Text).build(); @Override public void onCreate(Bundle savedInstanceState) { ...... Log.d("Database 1", "notesQuery.list()="+notesQuery.list().toString()); // get the note DAO for Database2 DaoSession daoSessionForDb2 = ((App) getApplication()).getDaoSession1(); noteDao2 = daoSessionForDb2.getNoteDao(); // query all notes, sorted az by their text notesQuery2 = noteDao2.queryBuilder().orderAsc(NoteDao.Properties.Text).build(); Log.d("Database 2", "notesQuery2.list()="+notesQuery2.list().toString()); updateNotes(); } //Replace updateNotes as private void updateNotes() { List<Note> notes = notesQuery.list(); List<Note> notes2 = notesQuery2.list(); notes.addAll(notes2); notesAdapter.setNotes(notes); } //Replace addNote as private void addNote() { String noteText = editText.getText().toString(); editText.setText(""); final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); String comment = "Added on " + df.format(new Date()); Note note = new Note(); note.setText(noteText); note.setComment(comment); note.setDate(new Date()); note.setType(NoteType.TEXT); if(!switchDbBetweenOneAndTwo){ note.setText(noteText + " In database 1"); noteDao.insert(note); } else { note.setText(noteText + " In database 2"); noteDao2.insert(note); } Log.d("DaoExample", "Inserted new note, ID: " + note.getId()); switchDbBetweenOneAndTwo = true; updateNotes(); } 

No hice ningún cambio en el archivo gradle o agregó nada ya que no tiene ningún sentido para mí.

Para Greendao Versión 3, no es posible tener más de 1 esquema.

Github.com/greenrobot/greenDAO/issues/356

Como escribieron en su sitio web también:

Tenga en cuenta que actualmente no se admiten varios esquemas cuando se utiliza el complemento Gradle . Por el momento, continúe utilizando su proyecto generador.

Han añadido esta característica a la nueva GreenDao.

  • Anotar el objeto generado greenDao
  • Persistencia de entidades bidireccionales con Green-DAO
  • Forma adecuada para agregar columnas de índice en greenDao?
  • Android - Observer DB cambia con GreenDao ORM
  • Cómo pre-poblar una base de datos DAO sqlite verde
  • Hilo de fondo que bloquea la interfaz de usuario durante varios segundos
  • Cómo limpiar / eliminar base de datos greenDao
  • Comprender la eliminación y eliminación de relaciones en greenDao
  • ¿Cómo combinar múltiples operaciones greenDAO Tx en una sola transacción?
  • Múltiples relaciones toMany con una sola tabla
  • Android No se puede cifrar la base de datos utilizando sqlcipher usando greendao
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.