对GreenDao数据库操作的封装

文章目录

  • 简介
  • 解决方案
  • git地址

简介

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

git地址

https://github.com/ddnosh/AndroidQuick

你可能感兴趣的:(Android,模块)