本文主要参考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来操作数据库