在具有 2 个不同模式的 Greendao 中使用超过 1 个数据库 - Android

Using more than 1 Database in Greendao with 2 different Schemas - Android

我在项目中有2个数据库,其中一个是我打开应用程序时创建的,另一个是随资产提供的。

生成 DaoSession 时,会为所有模型创建 DaoSession。

gradle 文件中的模式也用于两个数据库

如何区分这 2 个数据库及其模式?

您需要创建两个不同的 类 来扩展 org.greenrobot.greendao.database.DatabaseOpenHelper。这两个不同的 类 DevOpenHelperForDatabase1DevOpenHelperForDatabase2 将处理 db realted I/o。从下面的代码中可以很容易地理解创建具有相同和不同模式或 table 或实体的两个不同数据库:

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

您可以访问相同和不同的架构或 table 或实体,例如 Activity 中的以下示例:

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

现在在 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();
}

我没有对 gradle 文件进行任何更改或添加任何内容,因为这对我来说没有任何意义。

对于 Greendao 版本 3,不可能有超过 1 个模式。

github.com/greenrobot/greenDAO/issues/356

正如他们在网站上所写的那样:

Note that multiple schemas are currently not supported when using the Gradle plugin . For the time being, continue to use your generator project.

他们已经将此功能添加到新的 GreenDao 中。