2017-02-19 2 views
6

У меня есть 2 базы данных в проекте, один из которых создан при открытии приложения, другой - с активами.Использование более 1 базы данных в Greendao с двумя различными схемами - Android

При создании DaoSession DaoSession создается для всех моделей.

также схемы в Gradle файл используется для обеих баз данных

Как я могу различать между 2 базами данных и их схемы?

ответ

0

Для версии Greendo 3 не возможно иметь более 1 схемы.

github.com/greenrobot/greenDAO/issues/356

Как пишет на своем сайте также:

Обратите внимание, что несколько схем являются currently not supported when using the Gradle plugin. В настоящее время продолжайте использовать ваш генератор .

Они добавили эту функцию еще к новому GreenDao.

6

Вам необходимо создать два разных класса, которые продлят org.greenrobot.greendao.database.DatabaseOpenHelper. Эти два разных класса DevOpenHelperForDatabase1 и DevOpenHelperForDatabase2 будут обрабатывать db realted I/o. Это versy легко понять из приведенной ниже коды, чтобы создать две разные базы данных с одной и другой схемой или таблицей или лицами:

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; 
} 
} 

Вы можете получить доступ к тому же и другой схеме или таблице или объектам, как показано ниже от деятельности в качестве примера :

// 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(); 

Обновление 2 :: выше можно выбросить, но этот подход будет тем же самым. Обновление сделано на основе обсуждения в комментариях ниже:

Я сделал изменения в примере greenDAO -> examples

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; 
} 
} 

Теперь сделайте следующую chnages в 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 a-z 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(); 
} 

Я не внес никаких изменений в или добавить что-либо, поскольку он не имеет никакого смысла для меня.

+0

ДаоSessionForDatabase автоматически сгенерированные файлы. Мы не можем назвать это или изменить свое имя сами. Вы проверили этот код? это действительно работает? или вы ожидаете, как это может быть? – MBH

+0

Я сделал то же самое для ежевики через год, используя разные дао. Я ожидаю, что это будет основано на опыте. –

+0

К сожалению, это не так в GreenDao, схема установлена ​​в файле gradle. Я думаю, это будет по-другому. – MBH

Смежные вопросы