GreenDao集成与使用
GreenDao升级数据库原有数据
先看流程图
为了更方便理解,添加一个Note1实体类,然后结构变成:
GreenDao默认生成了四个类:
1. DaoMaster
包含元素:
数据库版本号:
public static final int SCHEMA_VERSION = 1;
创建表和删除表(分为存在和不存在两种状态):
NoteDao.createTable(db, ifNotExists);
Note1Dao.createTable(db, ifNotExists);
NoteDao.dropTable(db, ifExists);
Note1Dao.dropTable(db, ifExists);
初始化DaoSession:
new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
版本升级:
public static abstract class OpenHelper extends DatabaseOpenHelper {
...
@Override
public void onCreate(Database db) {
Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
createAllTables(db, false);
}
}
初始化DaoConfig以及daoConfigMap:
DaoConfig daoConfig = new DaoConfig(db, daoClass);
daoConfigMap.put(daoClass, daoConfig);
2. DaoSession
1. 根据DaoConfig生成NoteDao、Note1Dao
private final NoteDao noteDao;
private final Note1Dao note1Dao;
public DaoSession(...) {
super(db);
noteDaoConfig = daoConfigMap.get(NoteDao.class).clone();
noteDaoConfig.initIdentityScope(type);
note1DaoConfig = daoConfigMap.get(Note1Dao.class).clone();
note1DaoConfig.initIdentityScope(type);
noteDao = new NoteDao(noteDaoConfig, this);
note1Dao = new Note1Dao(note1DaoConfig, this);
...
}
2. NoteDao、Note1Dao添加到entityToDao,缓存NoteDao、Note1Dao
protected <T> void registerDao(Class<T> entityClass, AbstractDao<T, ?> dao) {
entityToDao.put(entityClass, dao);
}
3. 返回NoteDao、Note1Dao
public NoteDao getNoteDao() {
return noteDao;
}
public Note1Dao getNote1Dao() {
return note1Dao;
}
4. 根据entityToDao对NoteDao、Note1Dao进行增删改查(只贴出来添加)
/** Convenient call for {@link AbstractDao#insert(Object)}. */
public <T> long insert(T entity) {
@SuppressWarnings("unchecked")
AbstractDao<T, ?> dao = (AbstractDao<T, ?>) getDao(entity.getClass());
return dao.insert(entity);
}
3. Note1Dao、NoteDao
包含:
1. 表名
public static final String TABLENAME = "NOTE";
2. 创建表
/** Creates the underlying database table. */
public static void createTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "\"NOTE\" (" + //
"\"_id\" INTEGER PRIMARY KEY ," + // 0: id
"\"TEXT\" TEXT NOT NULL );"); // 1: text
}
3. 删除表
/** Drops the underlying database table. */
public static void dropTable(Database db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"NOTE\"";
db.execSQL(sql);
}
4. 增删改查操作(父类中实现)
只举例save方法
public void save(T entity) {
if (hasKey(entity)) {
update(entity);
} else {
insert(entity);
}
}
生成的每个类的功能基本上都了解了,了解具体的流程还有Database没有了解:
Database实际使用对象为StandardDatabase
举例子:
private final SQLiteDatabase delegate;
@Override
public void execSQL(String sql) throws SQLException {
delegate.execSQL(sql);
}
- 可以看出来Database就是调用SQLiteDatabase的一个桥梁。
- GreenDao底层用的就是SQLite存储。