GreenDao源码分析

GreenDao集成与使用

GreenDao升级数据库原有数据

先看流程图
在这里插入图片描述
为了更方便理解,添加一个Note1实体类,然后结构变成:
在这里插入图片描述
GreenDao默认生成了四个类:

  1. DaoMaster
  2. DaoSession
  3. Note1Dao、NoteDao

1. DaoMaster

包含元素:

  1. 数据库版本号
  2. 静态方法创建表和删除表
  3. 静态方法初始化DaoSession
  4. 控制版本升级/测试版版本升级
  5. 初始化DaoConfig以及daoConfigMap

数据库版本号:

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
  2. NoteDao、Note1Dao添加到entityToDao,缓存NoteDao、Note1Dao
  3. 返回NoteDao、Note1Dao
  4. 根据entityToDao对NoteDao、Note1Dao进行增删改查

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. 表名
  2. 创建表
  3. 删除表
  4. 增删改查操作(父类中实现)

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);
}
  1. 可以看出来Database就是调用SQLiteDatabase的一个桥梁。
  2. GreenDao底层用的就是SQLite存储。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值