一、概述

在之前一个项目中,因为涉及到数据库,所以就接触到了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灵感也是从它而来,已经写的代码虽说有用到设计模式,但是概念都很模糊,个人感觉非常适合我这样的小白。
源码点击下载

更多相关文章

  1. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精
  2. Android本地数据存储之Sharedpreference
  3. AIDL详解2——复杂数据通信
  4. Android Studio精彩案例(五)《JSMS短信验证码功能实现》
  5. Android数据的四种存储方式
  6. 微信抢红包插件与Android辅助功能
  7. Android原生Contacts——界面和数据库
  8. android图片涂鸦——旋转与文字功能的实现原理
  9. [Android]如何导入已有的外部数据库

随机推荐

  1. 深入理解Java Callable接口
  2. Java操作Sqlite数据库
  3. App Engine JDO Persistent类从com.googl
  4. 使用java实现的超简单的单向链表 头插法
  5. 在JComboBox箭头JButton上附加动作事件
  6. socket实现客户端与服务端通信(一)服务端
  7. 快来寻找属于你的超级OA
  8. TransactionSystemException:无法提交JPA
  9. java实现约瑟夫问题
  10. Java:在特定队列大小之后,以提交方式阻塞