在Greendao中使用2个以上的数据库,使用2个不同的模式 - Android

时间:2017-02-19 15:42:16

标签: android greendao greendao3

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

您可以访问与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文件或添加任何内容,因为它对我没有任何意义。

答案 1 :(得分:1)

对于Greendao第3版,不可能有超过1个架构。

github.com/greenrobot/greenDAO/issues/356

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

  

请注意,多个架构为currently not supported when using the Gradle plugin 。目前,继续使用您的发电机   项目

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