热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[置顶]Android数据库框架GreenDao封装使用,易理解、易扩展

一、概述在之前一个项目中,因为涉及到数据库,所以就接触到了ORM框架的GreenDao。后面就去网上大量的搜索下载学习,发现很多都是官网的翻译或者是官网DEMO的简单入门讲解,而且对于小白,也不知道从
一、概述 在之前一个项目中,因为涉及到数据库,所以就接触到了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 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 queryPerson(WhereCondition arg0,
WhereCondition... conditions) {
QueryBuilder qb = personDao.queryBuilder();
qb.where(arg0, conditions);
List 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 qb = personDao.queryBuilder();
DeleteQuery 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 getPersonByName(String name) {
List list = null;
list = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name));
return list;
}

// 查找排序
public static List getPerson() {
List persOnList= null;
persOnList= App.daoManager.orderAscPerson();
return personList;
}

//==============================insertDao====================================
public static void insertPersonDao(JsonCode jsonCode) {
// 添加数据
for (int i = 0; i App.daoManager.insertPerson(jsonCode.getPerson().get(i));
}
}

public static boolean checkPersonExistAndUpdate(String name) {
List persOnList= App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name));
if (personList.size() > 0) {
for (int i = 0; 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灵感也是从它而来,已经写的代码虽说有用到设计模式,但是概念都很模糊,个人感觉非常适合我这样的小白。偷笑
源码点击下载


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 标题: ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
风尚宣城_588
这个家伙很懒,什么也没留下!
RankList | 热门文章