GreenDao 使用

本文主要参考http://glblong.blog.51cto.com/3058613/1354953.

一、greenDAO相关

1.greenDAO官网:http://greendao-orm.com/
2.项目下载地址:https://github.com/greenrobot/greenDAO(或者官网)
greenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。
greenDAO的主要设计目标:

  • 最大性能(最快的Android ORM)
  • 易于使用API
  • 高度优化
  • 最小内存消耗

二、使用步骤

首先需要新建一个java工程来生成DAO类文件,该工程需要导入greendao-generator.jar和freemarker.jar文件到项目中。

    public static void main(String[] args) throws Exception {
        Schema schema = new Schema(2, "com.client.database.im");
        addMessage(schema);
        new DaoGenerator().generateAll(schema, "./src-gen");
    }

    private static void addMessage(Schema schema) {
        Entity conversation = schema.addEntity("Conversations");
        conversation.addIdProperty();
        conversation.addStringProperty("className");
        conversation.addIntProperty("conversation_type").notNull();

        Entity messages = schema.addEntity("Messages");
        messages.addIdProperty();
        Property conversation_ID = messages.addLongProperty("conversation_ID")
                .notNull().getProperty();
        messages.addToOne(conversation, conversation_ID);
    }

在Main方法中,

   Schema schema = new Schema(2, "com.client.database.im");

第一个参数表示数据库版本号,如果发生变更会导致数据库更新的操作被调用(如果不修改生成的DaoMaster中的方法,那么升级默认操作是删除所有表并重新建表),第二个参数是生成的DAO类的包路径.

 new DaoGenerator().generateAll(schema, "./src-gen");

表示来执行生成过程,其中src-gen请提前创建,否则会报错.

每个Entity代表一个表:

 Entity conversation = schema.addEntity("Conversations");

这个语句会创建一个名叫Conversations的表.

 conversation.addIdProperty();

会创建一个ID做为主键.

    conversation.addStringProperty("className");
    conversation.addIntProperty("conversation_type").notNull();

则是增加字段的方法(在生成的实体类中,int类型为自动转为long类型).

三.增删改查

增删改查相当方便,完全的面向对象,不需要涉及到任何的sql语言。

app中使用时建议创建一个辅助类,管理DaoMater和每个表的DAO.

public class DBHelper {

    private static DBHelper instance;
    private static Context mContext;

    private static DaoMaster daoMaster;
    private static DaoSession daoSession;
    private ConversationsDao conversationsDao;
    private MessagesDao messagesDao;
    private MuteContactDao muteContactDao;

    /**
     * 取得DaoMaster
     * 
     * @param context
     * @return
     */
    public static DaoMaster getDaoMaster(Context context) {
        if (daoMaster == null) {
            OpenHelper helper = new DaoMaster.DevOpenHelper(context,
                    "im-db.db", null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 取得DaoSession
     * 
     * @param context
     * @return
     */
    public static DaoSession getDaoSession(Context context) {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster(context);
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    private DBHelper() {
    }

    public static void init(Context context) {
        mContext = context;
        instance = new DBHelper();
        // 数据库对象
        DaoSession daoSession = getDaoSession(mContext);
        instance.setMessagesDao(daoSession.getMessagesDao());
        instance.setConversationsDao(daoSession.getConversationsDao());
        instance.setMuteContactDao(daoSession.getMuteContactDao());

    }

    private void setMuteContactDao(MuteContactDao muteContactDao) {
        this.muteContactDao = muteContactDao;
    }

    public MuteContactDao getMuteContactDao() {
        return muteContactDao;
    }

    public static DBHelper getInstance() {
        return instance;
    }

    public ConversationsDao getConversationsDao() {
        return conversationsDao;
    }

    public void setConversationsDao(ConversationsDao conversationsDao) {
        this.conversationsDao = conversationsDao;
    }

    public MessagesDao getMessagesDao() {
        return messagesDao;
    }

    public void setMessagesDao(MessagesDao messagesDao) {
        this.messagesDao = messagesDao;
    }

    public int getAllMessageNumByConversationID(Long id) {
        QueryBuilder<Messages> qb = messagesDao.queryBuilder();
        qb.where(com.edugateapp.client.database.im.MessagesDao.Properties.Conversation_ID
                .eq(id));
        return (int) qb.buildCount().count();
    }
}

这样程序打开时调用一次init后,就可以直接获取DAO来操作数据库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容