一、概述
在之前一个项目中,因为涉及到数据库,所以就接触到了ORM框架的GreenDao。后面就去网上大量的搜索下载学习,发现很多都是官网的翻译或者是官网DEMO的简单入门讲解,而且对于小白,也不知道从何下手,最终还是放弃选择了本地sqlite。
时隔不久,GreenDao的应用已经是家常便饭了,于是乎,在上个周末就抽取了些时间对官网的DEMO进行拆解封装,并且完善了功能,尽可能的易于理解和扩展,方便以后直接拿来用。
二、效果图
下图addData/deleteData/changeData/queryData(分别对应数据库的增、删、改、查效果),由于时间上的原因,没有界面效果图。在这上面花费太多时间,也是因为这个才想分享给大家,后面大家可以自行下载添加
三、代码
工程主要分为三部分文件:dao(官方demo生成类)、manager(具体功能实现类)、utils(封装操作类)
dao就不晒代码了,跟官网的差不多。manager文件夹中有App和DaoManager类,App主要是初始化新建数据库,DaoManager负责具体实现数据库操作功能。
App类:
package com.example.jekin.greendao.manager; import android.app.Application; import android.content.Context; import com.example.jekin.greendao.dao.DaoMaster; import com.example.jekin.greendao.dao.DaoSession; /** * Created by JeKin on 2016/4/8. */ public class App extends Application{ public static App mInstance; public static DaoMaster daoMaster; public static DaoSession daoSession; public static DaoManager daoManager; @Override public void onCreate() { super.onCreate(); mInstance = this; daoManager = DaoManager.getInstance(getApplicationContext()); } /** * 取得DaoMaster * * @param context * @return daoMaster */ public static DaoMaster getDaoMaster(Context context) { DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context, "person.db", null); daoMaster = new DaoMaster(helper.getWritableDatabase()); return daoMaster; } /** * 取得DaoSession * * @param context * @return daoSession */ public static DaoSession getDaoSession(Context context) { if (daoSession == null) { if (daoMaster == null) { daoMaster = getDaoMaster(context); } daoSession = daoMaster.newSession(); } return daoSession; } }
DaoManager类:
package com.example.jekin.greendao.manager; import android.content.Context; import com.example.jekin.greendao.dao.DaoSession; import com.example.jekin.greendao.dao.Person; import com.example.jekin.greendao.dao.PersonDao; import java.util.List; import de.greenrobot.mydao.query.DeleteQuery; import de.greenrobot.mydao.query.QueryBuilder; import de.greenrobot.mydao.query.WhereCondition; /** * Created by JeKin on 2016/4/8. * 功能实现类 */ public class DaoManager { private static DaoManager instance; private static Context appContext; private DaoSession mDaoSession; private PersonDao personDao; public DaoManager(){ } public static DaoManager getInstance(Context context){ if (instance == null){ instance = new DaoManager(); if (appContext == null) { appContext = context.getApplicationContext(); } instance.mDaoSession = App.getDaoSession(context); instance.personDao = instance.mDaoSession.getPersonDao(); } return instance; } /** * ================Person====================* */ public List<Person> orderAscPerson() { return personDao.queryBuilder().orderAsc(PersonDao.Properties.Id).list(); } /** * Person插入功能 * * @return * @param:album */ public void insertPerson(Person person) { personDao.insert(person); } public void insertOrReplacePerson(Person person) { personDao.insertOrReplaceInTx(person); } public void updatePerson(Person person) { personDao.update(person); } /** * Person查找功能 * //查找条件 * @param arg0 * @param conditions * @return:albumList */ public List<Person> queryPerson(WhereCondition arg0, WhereCondition... conditions) { QueryBuilder<Person> qb = personDao.queryBuilder(); qb.where(arg0, conditions); List<Person> personList = qb.list(); return personList; } /** * Person删除所有功能 * * @param * @return */ public void deleteAllPerson() { personDao.deleteAll(); } /** * Person删除功能 * * @return * @param:album */ public void deletePerson(Person person) { personDao.delete(person); } public void deletePersonByName(String name) { QueryBuilder<Person> qb = personDao.queryBuilder(); DeleteQuery<Person> bd = qb.where(PersonDao.Properties.Name.eq(name)) .buildDelete(); bd.executeDeleteWithoutDetachingEntities(); } }
utils文件夹下只有DaoUtils封装类,易于后期扩展,懂点单词的都很容易看懂
package com.example.jekin.greendao.utils; import com.example.jekin.greendao.dao.Person; import com.example.jekin.greendao.dao.PersonDao; import com.example.jekin.greendao.dao.JsonCode; import com.example.jekin.greendao.manager.App; import java.util.List; /** * Created by JeKin on 2016/4/8. * 对数据库的实现进行封装,隐藏实现细节 */ public class DaoUtils { //===================getPersonDao======================== public static List<Person> getPersonByName(String name) { List<Person> list = null; list = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name)); return list; } // 查找排序 public static List<Person> getPerson() { List<Person> personList = null; personList = App.daoManager.orderAscPerson(); return personList; } //==============================insertDao==================================== public static void insertPersonDao(JsonCode jsonCode) { // 添加数据 for (int i = 0; i < jsonCode.getPerson().size(); i++) { App.daoManager.insertPerson(jsonCode.getPerson().get(i)); } } public static boolean checkPersonExistAndUpdate(String name) { List<Person> personList = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name)); if (personList.size() > 0) { for (int i = 0; i < personList.size(); i++) { Person person = new Person(personList.get(i).getId(), personList.get(i).getName(), personList.get(i).getHigh(), personList.get(i).getAge()); App.daoManager.insertOrReplacePerson(person); } return true; } return false; } }
最后就是我们的老大出场了,主要代码就四句
MainActivity:
package com.example.jekin.greendao; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import com.example.jekin.greendao.dao.Person; import com.example.jekin.greendao.dao.JsonCode; import com.example.jekin.greendao.manager.App; import com.example.jekin.greendao.utils.DaoUtils; import com.google.gson.Gson; import java.util.ArrayList; /** * Created by JeKin on 2016/04/12 * 数据操作类 */ public class MainActivity extends AppCompatActivity { private static final String TAG1 = "addData"; private static final String TAG2 = "deleteData"; private static final String TAG3 = "changeData"; private static final String TAG4 = "queryData"; // 模拟JSON数据 private String jsonString = "{'code':'200','success':'true','Person':[{'name':'jekin','high':'173','age':'23'},{'name':'mike','high':'178','age':'24'}]}"; // 查找数据的条件 private String name = "mike"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JsonCode jsonCode = new Gson().fromJson(jsonString, JsonCode.class); // 添加数据 // 检查是否已经存在该Person对象,不存在则插入 boolean isExist = DaoUtils.checkPersonExistAndUpdate(name); if (!isExist) { DaoUtils.insertPersonDao(jsonCode); } // 增加之后查找数据 for (Person person : DaoUtils.getPerson()) { Log.e(TAG1, person.getId().toString()); Log.e(TAG1, person.getName().toString()); Log.e(TAG1, person.getHigh().toString()); Log.e(TAG1, person.getAge().toString()); } // 条件删除 App.daoManager.deletePersonByName(name); for (Person person : DaoUtils.getPerson()) { Log.e(TAG2, person.getId().toString()); Log.e(TAG2, person.getName().toString()); Log.e(TAG2, person.getHigh().toString()); Log.e(TAG2, person.getAge().toString()); } // 条件修改 if (DaoUtils.checkPersonExistAndUpdate(name)) { for (Person person : DaoUtils.getPersonByName(name)) { Log.e(TAG3, person.getId().toString()); Log.e(TAG3, person.getName().toString()); Log.e(TAG3, person.getHigh().toString()); Log.e(TAG3, person.getAge().toString()); } } // 修改之后查询语句 for (Person person : DaoUtils.getPerson()) { Log.e(TAG4, person.getId().toString()); Log.e(TAG4, person.getName().toString()); Log.e(TAG4, person.getHigh().toString()); Log.e(TAG4, person.getAge().toString()); } } }
四、结论
没有界面,所以就渣渣的在LogCat输出查看而已,json数据是模拟数据,如果涉及到网络数据那就不方便大家看到效果了,请见谅。后期扩展的话,只需要在dao文件夹下增加相应的实体类和xxDao绑定数据类,如果还需要其他数据操作功能,可以在DaoUtils实现(可参考Person,代码中主要以该对象为例)。以上是个人对GreenDao的总结,希望能帮助更多的同胞。代码如果存在什么问题,请及时指出,不要给各位留下什么坑,这也是第二次写博客,多多指教!
最后,推荐大家去看一本《Android设计模式》的书,因为写这个demo灵感也是从它而来,已经写的代码虽说有用到设计模式,但是概念都很模糊,个人感觉非常适合我这样的小白。