GreenDao需要在Java工程里面生产对应的java文件,具体过程不在此赘述,相应的Java工程可以参考:https://github.com/ddnosh/GreenDaoGenerator
这里用User表来说明,这是系统生成的User表对应的User.java文件。
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.
/** * Entity mapped to table USER. */
public class User {
private Long id;
private String name;
private Integer age;
public User() {
}
public User(Long id) {
this.id = id;
}
public User(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
相应地,系统会生成一个UserDao文件,里面实现了对User表的增删改查。
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/** * DAO for table USER. */
public class UserDao extends AbstractDao<User, Long> {
public static final String TABLENAME = "USER";
/** * Properties of entity User.
* Can be used for QueryBuilder and for referencing column names. */
public static class Properties {
public final static Property Id = new Property(0, Long.class, "id", true, "_id");
public final static Property Name = new Property(1, String.class, "name", false, "NAME");
public final static Property Age = new Property(2, Integer.class, "age", false, "AGE");
};
public UserDao(DaoConfig config) {
super(config);
}
public UserDao(DaoConfig config, DaoSession daoSession) {
super(config, daoSession);
}
/** Creates the underlying database table. */
public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "'USER' (" + //
"'_id' INTEGER PRIMARY KEY ," + // 0: id
"'NAME' TEXT," + // 1: name
"'AGE' INTEGER);"); // 2: age
}
/** Drops the underlying database table. */
public static void dropTable(SQLiteDatabase db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'USER'";
db.execSQL(sql);
}
/** @inheritdoc */
@Override
protected void bindValues(SQLiteStatement stmt, User entity) {
stmt.clearBindings();
Long id = entity.getId();
if (id != null) {
stmt.bindLong(1, id);
}
String name = entity.getName();
if (name != null) {
stmt.bindString(2, name);
}
Integer age = entity.getAge();
if (age != null) {
stmt.bindLong(3, age);
}
}
/** @inheritdoc */
@Override
public Long readKey(Cursor cursor, int offset) {
return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
}
/** @inheritdoc */
@Override
public User readEntity(Cursor cursor, int offset) {
User entity = new User( //
cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // name
cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2) // age
);
return entity;
}
/** @inheritdoc */
@Override
public void readEntity(Cursor cursor, User entity, int offset) {
entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
entity.setName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
entity.setAge(cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2));
}
/** @inheritdoc */
@Override
protected Long updateKeyAfterInsert(User entity, long rowId) {
entity.setId(rowId);
return rowId;
}
/** @inheritdoc */
@Override
public Long getKey(User entity) {
if(entity != null) {
return entity.getId();
} else {
return null;
}
}
/** @inheritdoc */
@Override
protected boolean isEntityUpdateable() {
return true;
}
}
还有一个DaoSession,里面存放了各种表的Dao文件:
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/** * {@inheritDoc} * * @see de.greenrobot.dao.AbstractDaoSession */
public class DaoSession extends AbstractDaoSession {
private final DaoConfig userDaoConfig;
private final UserDao userDao;
public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
daoConfigMap) {
super(db);
userDaoConfig = daoConfigMap.get(UserDao.class).clone();
userDaoConfig.initIdentityScope(type);
userDao = new UserDao(userDaoConfig, this);
registerDao(User.class, userDao);
}
public void clear() {
userDaoConfig.getIdentityScope().clear();
}
public UserDao getUserDao() {
return userDao;
}
}
如果要通过UserDao操作数据库表,还需要经过以下步骤:
if (daoMaster == null) {
DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context, "aq-green.db", null);
daoMaster = new DaoMaster(helper.getWritableDatabase());
}
daoSession = daoMaster.newSession();
获取到DaoSession,通过DaoSession,找到对应的Dao文件, 比如UserDao,然后访问Dao文件中的insert、querybuilder、update、delete方法,完成增删改查操作。
实际上,DaoSession只需要获取一次即可,不需要每次都通过new DaoMaster和new DaoMaster.DevOpenHelper去获取。这样我们可以通过单例模式,新建一个Dao类,这里我们叫做RealUserDao,这是个单例类,主要的功能就是获取UserDao实例,然后在RealUserDao里面实现操作数据库的业务,比如各种操作数据库的方法,看下RealUserDao:
/** * @author ddnosh * @website http://blog.csdn.net/ddnosh */
public class RealUserDao {
private static String TAG = "RealUserDao";
private static RealUserDao INSTANCE;
private UserDao userDao;
public RealUserDao() {
this.userDao = DBManager.getInstance().getDaoSession().getUserDao();
}
public static RealUserDao getInstance() {
if (INSTANCE == null) {
synchronized (RealUserDao.class) {
if (INSTANCE == null) {
INSTANCE = new RealUserDao();
}
}
}
return INSTANCE;
}
public User addUser(User user) {
try {
userDao.insert(user);
} catch (Exception e) {
e.printStackTrace();
}
LogUtil.i(TAG, "new user is inserted, the id is " + user.getId());
return user;
}
public synchronized User queryUser(int id) {
User user = userDao.queryBuilder().
where(UserDao.Properties.Id.eq(id)).build().unique();
return user;
}
public synchronized List<User> queryAllUsers() {
List<User> userList = userDao.queryBuilder().
orderDesc(UserDao.Properties.Id).list();
return userList;
}
public synchronized void updateUser(User user) {
if (user == null) {
return;
}
userDao.update(user);
}
public synchronized void deleteUser(String name) {
User user = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().unique();
if (user == null) {
return;
}
userDao.delete(user);
}
}
https://github.com/ddnosh/AndroidQuick