greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案,对象关系映射(Object Relational Mapping,简称ORM)用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
为了在我们的 Android 工程中使用 greenDAO ,我们需要另建一个纯 Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。
DAO(Data Access Object)是一个数据访问接口,负责与数据库打交道。夹在业务逻辑与数据库资源中间。
OK,我们开始操作,我首先在Eclipse中建立了一个Java工程(你也可以在Android Studio中建立,通过 File -> New -> New Module -> Java Library -> 填写相应的包名与类名 -> Finish)。
编写 ExampleDaoGenerator 类,Java 工程只有这一个类(是不是很简单),它的内容决定了「GreenDao Generator」的输出,你可以在这个类中通过对象、关系等创建数据库结构。
public class ExampleDaoGenerator
{
public static void main(String[] args) throws Exception
{
//参数1是数据库版本号,“com.my.greendao”是包名(就是你要复制到Android工程里面的包名)
Schema schema = new Schema(1, "com.my.greendao");//可将Schema理解为数据库上下文(这不是我说的)
addUser(schema); //相当于建立一个用户表,add...(schema)方法就相当于新建了一张表。
//new DaoGenerator().generateAll()这个是生成Dao文件的方法,生成在src-gen文件夹里面,跟src同一级目录,
//所以你自己要在src同一级目录下新建一个src-gen文件夹(文件夹名字是“src-gen”,不是“gen”).
new DaoGenerator().generateAll(schema, "src-gen");
}
private static void addUser(Schema schema){
Entity note=schema.addEntity("UserEntity");//UserEntity相当于表的类名,通过UserEntity就可以访问这个表的属性了
note.addIdProperty().autoincrement();//添加自增的ID属性
note.addStringProperty("name").notNull();//添加字符串类型的name属性,且字段不可为空
note.addIntProperty("age").notNull();//添加Int类型的age属性,且字段不可为空
note.addBooleanProperty("sex").notNull();//添加布尔类型的sex属性,true代表男,false代表女,且字段不可为空
}
}
怎么样是不是很简单,你如果想要添加其他表,只管按照这个套路来,只需要写一个add...()表的方法,然后在main函数中调用一下,add...(schema)。
OK,接下来我们要运行这个main函数,然后在Refresh该工程(press F5),怎么样,是不是已经在src-gen文件夹下生成了一个Package。
接下来我们来新建一个Android工程,且慢,不好意思,忘记说了,上面那个Java工程要导入两个External Jar包,有个人把资源上传到CSDN了,你可以去http://download.csdn.net/detail/csm_qz/8569031下载,在Java工程用到的两个是greendao-generator-1.3.0.jar freemarker-2.3.20.jar,你也可以去greenDao官网下载。
在Module的build.gradle中的dependencies中添加如下语句:
compile 'de.greenrobot:greendao:1.3.7'
当然你也可以不添加这一句而直接使用导入包的形式,把你下载的greendao:1.3.7的那个Jar包导到你的Android工程。
OK,接下来我们又要编代码了,我们其实只需要写三个类:App类,MainActivity,DBHelper。
首先我们要写一个App类方便我们以后的数据库操作。(单例模式的思想,否则你每次进行数据操作都要new一个数据库管理对象)
public class App extends Application { private static DaoMaster daoMaster; private static DaoSession daoSession; public static SQLiteDatabase db; //数据库名,表名是自动被创建的 public static final String DB_NAME = "dbname.db"; @Override public void onCreate() { super.onCreate(); } public static DaoMaster getDaoMaster(Context context) { if (daoMaster == null) { DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context,DB_NAME, null); daoMaster = new DaoMaster(helper.getWritableDatabase()); } return daoMaster; } public static DaoSession getDaoSession(Context context) { if (daoSession == null) { if (daoMaster == null) { daoMaster = getDaoMaster(context); } daoSession = daoMaster.newSession(); } return daoSession; } public static SQLiteDatabase getSQLDatebase(Context context) { if (daoSession == null) { if (daoMaster == null) { daoMaster = getDaoMaster(context); } db = daoMaster.getDatabase(); } return db; } }然后我们来写DBHelper:
public class DBHelper { private static DBHelper instance; private static Context appContext; private DaoSession mDaoSession; private UserEntityDao userEntityDao; private DBHelper() { } public static DBHelper getInstance(Context context) { if (instance == null) { instance = new DBHelper(); if (appContext == null) { appContext = context.getApplicationContext(); } instance.mDaoSession = App.getDaoSession(context); instance.userEntityDao = instance.mDaoSession.getUserEntityDao(); } return instance; } public void dropuserEntityTable() { UserEntityDao.dropTable(mDaoSession.getDatabase(), true); } public void dropAllTable() { UserEntityDao.dropTable(mDaoSession.getDatabase(), true); } public void createAllTable() { UserEntityDao.createTable(mDaoSession.getDatabase(), true); } public long saveUserEntity(UserEntity userEntity) { return userEntityDao.insertOrReplace(userEntity); } public List<UserEntity> loadAllUserEntity() { List<UserEntity> userEntities = new ArrayList<UserEntity>(); List<UserEntity> tmpUserEntitys = userEntityDao.loadAll(); int len = tmpUserEntitys.size(); for (int i = len - 1; i >= 0; i--) { userEntities.add(tmpUserEntitys.get(i)); } return userEntities; } public void deleteUserEntity(UserEntity entity) { userEntityDao.delete(entity); } /** * query list with where clause * ex: begin_date_time >= ? AND end_date_time <= ? * * @param where where clause, include 'where' word * @param params query parameters * @return */ public List<UserEntity> queryUserEntity(String where, String... params) { return userEntityDao.queryRaw(where, params); } public void updateUserEntity(int id) { QueryBuilder<UserEntity> queryBuilder = userEntityDao.queryBuilder(); queryBuilder.where(UserEntityDao.Properties.Id.eq(1)) .where(UserEntityDao.Properties.Age.eq(23)); List<UserEntity> tmps = new ArrayList<UserEntity>(); tmps = queryBuilder.list(); for (int i = 0; i < tmps.size(); i++) { tmps.get(i).setName("阿图姆"); } userEntityDao.updateInTx(tmps); } }
怎么样是不是并不复杂,最后我们就在MainActivity中验证一下:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; //定义一个DBHelper对象,用他来对数据库进行增删改查 private DBHelper dBManager; UserEntity userEntity = new UserEntity(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dBManager = DBHelper.getInstance(this); //得到DBHelper对象 } public void addUser(View v) { userEntity.setName("武藤游戏"); userEntity.setAge(23); userEntity.setSex(true); //下面这一行就把entity对象存数据库了 dBManager.saveUserEntity(userEntity); Log.i(TAG, "插入数据成功"+userEntity.getName()); } public void deleteUser(View v) { if (userEntity != null) { dBManager.deleteUserEntity(userEntity); List<UserEntity> listUserEntity = dBManager.loadAllUserEntity(); if (listUserEntity.size() == 0) { Log.i(TAG, "删除数据成功"); } } } public void updateUser(View v) { if (userEntity != null) { dBManager.updateUserEntity(1); List<UserEntity> listUserEntity = dBManager.loadAllUserEntity(); Log.i(TAG,userEntity.getName() ); } } public void queryUser(View v) { List<UserEntity> listUserEntity = dBManager.loadAllUserEntity(); Log.i(TAG, "一共查找到" + listUserEntity.size() + "条记录"); } }怎么样是不是也不难啊,毕竟是初步学习嘛。上面的几个函数十几个按钮的监听函数,我把onClick属性写在布局文件中了。
接下来看看我们的测试结果:
07-01 10:08:32.331 10478-10478/com.myapplication I/MainActivity: 插入数据成功武藤游戏
07-01 10:08:41.604 10478-10478/com.myapplication I/MainActivity: 阿图姆
07-01 10:08:44.698 10478-10478/com.myapplication I/MainActivity: 一共查找到1条记录
07-01 10:08:46.676 10478-10478/com.myapplication I/MainActivity: 删除数据成功
07-01 10:08:47.819 10478-10478/com.myapplication I/MainActivity: 一共查找到0条记录
大功告成!
什么,你说你想我听歌?OK,我的唱吧:http://changba.com/s/AdwbB4FU-ZW6n7vEyIWZbQ?&code=Kxhsv6044ik&from=pcrecommend