Android ORM系列之GreenDao最佳实践

GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。

GreenDao有两个项目,一个是生成dao和model的generator的项目,该项目是java项目,一个是用于android的核心jar包。在使用前,我们必须先生成dao和model。

首先加入依赖。

compile ‘de.greenrobot:greendao:2.0.0‘
compile ‘de.greenrobot:greendao-generator:2.0.0‘

然后在我们的包名之下新建一个db的包,在db下新建dao和model的包以及一个generator的包,就像下图。

在generator包下,新建一个生成dao和model的类GreenDaoGenerator,在里面加入代码

public class GreenDaoGenerator {
    public static void main(String[] args) throws Exception {
        Schema schema = new Schema(1, "cn.edu.zafu.greendao.db.model");
        schema.setDefaultJavaPackageDao("cn.edu.zafu.greendao.db.dao");
        schema.enableKeepSectionsByDefault();
        //schema.enableActiveEntitiesByDefault();
        //ActiveRecord
        addEntity(schema);
        new DaoGenerator().generateAll(schema, "./app/src/main/java");
    }

    private static void addEntity(Schema schema) {
        Entity person = schema.addEntity("Person");
        person.addIdProperty().primaryKey();
        person.addStringProperty("name");
        person.addDoubleProperty("height");
        person.addDoubleProperty("weight");

        Entity card = schema.addEntity("Card");
        card.addIdProperty().primaryKey();
        card.addStringProperty("num");
        card.addStringProperty("address");

        Property idcardPK = person.addLongProperty("cardId").getProperty();
        person.addToOne(card, idcardPK);

        Property personPK = card.addLongProperty("personId").getProperty();
        card.addToOne(person,personPK);
    }

}

Schema schema = new Schema(1, “cn.edu.zafu.greendao.db.model”); 代表创建的数据库的版本号以及默认的java package,如果不修改默认的包名,生成的dao和model都会在该包下,这里我们修改了dao的包名schema.setDefaultJavaPackageDao(“cn.edu.zafu.greendao.db.dao”);,生成的model中,我们可能需要加入自己的一些信息,但是又不希望下次生成的时候消失,所以可以使用schema.enableKeepSectionsByDefault();,使用后会在model类中有如下这些标示

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END

// KEEP FIELDS - put your custom fields here
// KEEP FIELDS END

 // KEEP METHODS - put your custom methods here
// KEEP METHODS END

你只需将你需要的信息添加到这三个之间,分布代表引入的包,字段,方法。之后重新生成这些信息将会被保留。

schema.enableActiveEntitiesByDefault();代表实体类是否支持active,用过php中yii框架的都应该清楚,实体类可以直接进行crud操作。我们不开启就好了,如果开启了的话,实体类将之间支持update, refresh, deleted 等操作。

之后就使用 schema.addEntity()函数增加Entity 对象,即对应的实体类,通过添加属性方法addProperty系列方法增加字段,最后调用new DaoGenerator().generateAll(schema, “./app/src/main/java”);方法生成dao和model。

生成的步骤也很简单,在该类上右键,点run即可。

生成之后控制台就会输出

然后我们编写一个核心辅助类。用于获取DaoMaster和DaoSession

public class DbCore {
    private static final String DEFAULT_DB_NAME = "default.db";
    private static DaoMaster daoMaster;
    private static DaoSession daoSession;

    private static Context mContext;
    private static String DB_NAME;

    public static void init(Context context) {
        init(context, DEFAULT_DB_NAME);
    }

    public static void init(Context context, String dbName) {
        if (context == null) {
            throw new IllegalArgumentException("context can‘t be null");
        }
        mContext = context.getApplicationContext();
        DB_NAME = dbName;
    }

    public static DaoMaster getDaoMaster() {
        if (daoMaster == null) {
            DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(mContext, DB_NAME, null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    public static DaoSession getDaoSession() {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    public static void enableQueryBuilderLog(){

        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }
}

接下来就是基础的泛型Service

 {
    private AbstractDao mDao;

    public BaseService(AbstractDao dao) {
        mDao = dao;
    }

    public void save(T item) {
        mDao.insert(item);
    }

    public void save(T... items) {
        mDao.insertInTx(items);
    }

    public void save(List items) {
        mDao.insertInTx(items);
    }

    public void saveOrUpdate(T item) {
        mDao.insertOrReplace(item);
    }

    public void saveOrUpdate(T... items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void saveOrUpdate(List items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void deleteByKey(K key) {
        mDao.deleteByKey(key);
    }

    public void delete(T item) {
        mDao.delete(item);
    }

    public void delete(T... items) {
        mDao.deleteInTx(items);
    }

    public void delete(List items) {
        mDao.deleteInTx(items);
    }

    public void deleteAll() {
        mDao.deleteAll();
    }

    public void update(T item) {
        mDao.update(item);
    }

    public void update(T... items) {
        mDao.updateInTx(items);
    }

    public void update(List items) {
        mDao.updateInTx(items);
    }

    public  T query(K key) {
        return  mDao.load(key);
    }

    public List queryAll() {
        return mDao.loadAll();
    }

    public List query(String where, String... params) {

        return mDao.queryRaw(where, params);
    }

    public QueryBuilder queryBuilder() {

        return mDao.queryBuilder();
    }

    public long count() {
        return mDao.count();
    }

    public void refresh(T item) {
        mDao.refresh(item);

    }

    public void detach(T item) {
        mDao.detach(item);
    }
}
" data-snippet-id="ext.28cd87bcf7b80ae158ac8a8cb2592b4d" data-snippet-saved="false" data-csrftoken="X78ashm8-qdtZAdswI6QWL7nrYl61g05iwCQ" data-codota-status="done">public class BaseService<T, K> {
    private AbstractDao<T, K> mDao;

    public BaseService(AbstractDao dao) {
        mDao = dao;
    }

    public void save(T item) {
        mDao.insert(item);
    }

    public void save(T... items) {
        mDao.insertInTx(items);
    }

    public void save(List<T> items) {
        mDao.insertInTx(items);
    }

    public void saveOrUpdate(T item) {
        mDao.insertOrReplace(item);
    }

    public void saveOrUpdate(T... items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void saveOrUpdate(List<T> items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void deleteByKey(K key) {
        mDao.deleteByKey(key);
    }

    public void delete(T item) {
        mDao.delete(item);
    }

    public void delete(T... items) {
        mDao.deleteInTx(items);
    }

    public void delete(List<T> items) {
        mDao.deleteInTx(items);
    }

    public void deleteAll() {
        mDao.deleteAll();
    }

    public void update(T item) {
        mDao.update(item);
    }

    public void update(T... items) {
        mDao.updateInTx(items);
    }

    public void update(List<T> items) {
        mDao.updateInTx(items);
    }

    public  T query(K key) {
        return  mDao.load(key);
    }

    public List<T> queryAll() {
        return mDao.loadAll();
    }

    public List<T> query(String where, String... params) {

        return mDao.queryRaw(where, params);
    }

    public QueryBuilder<T> queryBuilder() {

        return mDao.queryBuilder();
    }

    public long count() {
        return mDao.count();
    }

    public void refresh(T item) {
        mDao.refresh(item);

    }

    public void detach(T item) {
        mDao.detach(item);
    }
}

一个实现类,第二个泛型参数是主键类型

 {
    public CardService(CardDao dao) {
        super(dao);
    }
}
public class PersonService extends BaseService {
    public PersonService(PersonDao dao) {
        super(dao);
    }
}" data-snippet-id="ext.cd9ffcb8b2eae21ea54d4709356e925a" data-snippet-saved="false" data-csrftoken="uvnlqI2I-Bgjt_eeNkFvBvVloGMmCfRRN6VU" data-codota-status="done">public class CardService extends BaseService<Card,Long> {
    public CardService(CardDao dao) {
        super(dao);
    }
}
public class PersonService extends BaseService<Person,Long> {
    public PersonService(PersonDao dao) {
        super(dao);
    }
}

编写一个工具类获得service

public class DbUtil {
    private static CardService cardService;
    private static PersonService personService;

    private static PersonDao getPersonDao() {
        return DbCore.getDaoSession().getPersonDao();
    }

    private static CardDao getCardDao() {
        return DbCore.getDaoSession().getCardDao();
    }

    public static CardService getCardService() {
        if (cardService == null) {
            cardService = new CardService(getCardDao());
        }
        return cardService;
    }

    public static PersonService getPersonService() {
        if (personService == null) {
            personService = new PersonService(getPersonDao());
        }
        return personService;
    }
}

在Application中初始化,并设置在清单文件中

public class App extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        DbCore.init(this);
    }
}

增删改查,下面为单元测试的方法

 {
    private PersonService mPersonService;
    private CardService mCardService;

    public ApplicationTest() {
        super(Application.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        DbCore.init(getContext());
        DbCore.enableQueryBuilderLog();
        mPersonService = DbUtil.getPersonService();
        mCardService = DbUtil.getCardService();
    }

    public void testSave(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        mCardService.save(c);

        Person p=new Person();
        p.setName("张三");
        p.setHeight(178.00);
        p.setWeight(65.00);
        p.setCard(c);
        mPersonService.save(p);

        c.setPerson(p);
        mCardService.saveOrUpdate(c);

    }
    public void testSave1(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("温州");

        mCardService.save(c, c1);

        c.setNum("11111");
        mCardService.saveOrUpdate(c, c1);

    }

    public void testSave2(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("温州");

        List cards=new ArrayList();

        cards.add(c);
        cards.add(c1);

        mCardService.save(cards);

        c1.setNum("22222");

        mCardService.saveOrUpdate(cards);

    }

    public void testDelete(){
        Card c=new Card();
        c.setNum("333333333333333");
        c.setAddress("3333");

        mCardService.save(c);
        mCardService.delete(c);

        c=new Card();
        c.setNum("444444");
        c.setAddress("44444444");

        mCardService.save(c);
        mCardService.deleteByKey(c.getId());

    }

    public void testDelete1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        mCardService.save(c,c1);
        mCardService.delete(c, c1);

    }

    public void testDelete2(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        List cards=new ArrayList();

        cards.add(c);
        cards.add(c1);

        mCardService.save(cards);
        mCardService.delete(cards);

    }

    public  void testDelete3(){
        mCardService.deleteAll();
    }

    public void testUpdate(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");
        mCardService.update(c);
    }
    public void testUpdate1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");

        Card c1=new Card();
        c1.setNum("6666");
        c1.setAddress("66666");

        mCardService.save(c1);
        c1.setNum("654321");
        mCardService.update(c,c1);
    }

    public void testUpdate2(){
        Card c=new Card();
        c.setNum("aaaaa");
        c.setAddress("aaaaaaaaaa");

        mCardService.save(c);
        c.setNum("bbbbbbbbb");

        Card c1=new Card();
        c1.setNum("ccccc");
        c1.setAddress("cccccccc");

        mCardService.save(c1);
        c1.setNum("dddddddddd");

        List cards=new ArrayList();

        cards.add(c);
        cards.add(c1);
        mCardService.update(cards);
    }

    public void testQuery(){
        Card c=new Card();
        c.setNum("aaaaa111");
        c.setAddress("aaaaaaaa11111aa");

        mCardService.save(c);

        List cards = mCardService.queryAll();
        Log.e("TAG", cards + "");

        Card query = mCardService.query(c.getId());
        Log.e("TAG", query + "");

        List query1 = mCardService.query("where NUM=?", c.getNum());
        Log.e("TAG", query1 + "");

        long count = mCardService.count();
        Log.e("TAG", count + "");

        List list = mCardService.queryBuilder().where(CardDao.Properties.Num.eq(c.getNum())).list();
        Log.e("TAG", list + "");
    }
}" data-snippet-id="ext.89d1ad8ddbfba90c8536db59b57b26c9" data-snippet-saved="false" data-csrftoken="n02wIPEW-drmeJwq73FEZ8IiYFsRv63QLKXY" data-codota-status="done">public class ApplicationTest extends ApplicationTestCase<Application> {
    private PersonService mPersonService;
    private CardService mCardService;

    public ApplicationTest() {
        super(Application.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        DbCore.init(getContext());
        DbCore.enableQueryBuilderLog();
        mPersonService = DbUtil.getPersonService();
        mCardService = DbUtil.getCardService();
    }

    public void testSave(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        mCardService.save(c);

        Person p=new Person();
        p.setName("张三");
        p.setHeight(178.00);
        p.setWeight(65.00);
        p.setCard(c);
        mPersonService.save(p);

        c.setPerson(p);
        mCardService.saveOrUpdate(c);

    }
    public void testSave1(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("温州");

        mCardService.save(c, c1);

        c.setNum("11111");
        mCardService.saveOrUpdate(c, c1);

    }

    public void testSave2(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("温州");

        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);

        mCardService.save(cards);

        c1.setNum("22222");

        mCardService.saveOrUpdate(cards);

    }

    public void testDelete(){
        Card c=new Card();
        c.setNum("333333333333333");
        c.setAddress("3333");

        mCardService.save(c);
        mCardService.delete(c);

        c=new Card();
        c.setNum("444444");
        c.setAddress("44444444");

        mCardService.save(c);
        mCardService.deleteByKey(c.getId());

    }

    public void testDelete1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        mCardService.save(c,c1);
        mCardService.delete(c, c1);

    }

    public void testDelete2(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);

        mCardService.save(cards);
        mCardService.delete(cards);

    }

    public  void testDelete3(){
        mCardService.deleteAll();
    }

    public void testUpdate(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");
        mCardService.update(c);
    }
    public void testUpdate1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");

        Card c1=new Card();
        c1.setNum("6666");
        c1.setAddress("66666");

        mCardService.save(c1);
        c1.setNum("654321");
        mCardService.update(c,c1);
    }

    public void testUpdate2(){
        Card c=new Card();
        c.setNum("aaaaa");
        c.setAddress("aaaaaaaaaa");

        mCardService.save(c);
        c.setNum("bbbbbbbbb");

        Card c1=new Card();
        c1.setNum("ccccc");
        c1.setAddress("cccccccc");

        mCardService.save(c1);
        c1.setNum("dddddddddd");

        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);
        mCardService.update(cards);
    }

    public void testQuery(){
        Card c=new Card();
        c.setNum("aaaaa111");
        c.setAddress("aaaaaaaa11111aa");

        mCardService.save(c);

        List<Card> cards = mCardService.queryAll();
        Log.e("TAG", cards + "");

        Card query = mCardService.query(c.getId());
        Log.e("TAG", query + "");

        List<Card> query1 = mCardService.query("where NUM=?", c.getNum());
        Log.e("TAG", query1 + "");

        long count = mCardService.count();
        Log.e("TAG", count + "");

        List<Card> list = mCardService.queryBuilder().where(CardDao.Properties.Num.eq(c.getNum())).list();
        Log.e("TAG", list + "");
    }
}

关于关联关系的映射,下一篇文章细说。

源码下载。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 14:38:03

Android ORM系列之GreenDao最佳实践的相关文章

[转]Android ORM系列之GreenDao最佳实践

GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储.更新.删除和查询. GreenDao有两个项目,一个是生成dao和model的generator的项目,该项目是java项目,一个是用于android的核心jar包.在使用前,我们必须先生成dao和model. 首先加入依赖. compile 'de.greenrobot:greendao:2.0.0' comp

Android ORM系列之GreenDao关联关系映射

上一篇文章对greenDao有一个整体的把握 Android ORM系列之GreenDao最佳实践.这篇文章将重点介绍GreenDao的关联关系的映射以及实体类的生成. 在GreenDao中,实体类的生成是通过Entity类来进行的,可以说一个Entity对象对应一个实体类.实体类中的属性可以通过Entity对象的方法进行添加,GreenDao会根据我们添加的属性自动生成实体类.我们可以通过一系列方法进行操作. 可以自定义一张表的表名 entity.setTableName("test"

Android ORM系列之GreenDao自定义类型转换器与代码混淆配置

有时候,我们的实体类中会有一些属性,但是数据库中没有对应的类型,这个时候我们就需要自定义转换器进行类型转换.很常见的处理就是Date类型一般如果精度要求不高的话我们会转换为Long类型进行存储,读取的的时候再讲其转换为Date类型.那么如果我们想要让它直接以时间字符串存储呢,这个也好办,GreenDao为我们提供了自定义类型转换的支持. 首先,我们需要实现PropertyConverter接口,实现里面的两个方法convertToEntityProperty和convertToDatabaseV

Android ORM数据库之GreenDao使用教程及源码分析

一.简介 1.Android ORM介绍 ?在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.下面先介绍下当前流行的5种ORM数据库框架: 1)OrmLite ?OrmLite不是Android 平台专用的ORM框架,它是

Android ORM 框架之 greenDAO 使用心得

原文:http://itangqi.me/android/using-greendao-experience/ 前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.而今天的主角便是 greenDAO,下面,我将

Android ORM 框架之 greenDAO

我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.而今天的主角便是 greenDAO,下面,我将详解地介绍如何在 Android Studio 上使用 greenDAO,并结合代码总结一些使用过程中的心得. 简单的

Android 快速开发系列 ORMLite 框架最佳实践

上一篇已经对ORMLite框架做了简单的介绍:Android ORMLite 框架的入门用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法. 通过上一篇的了解,我们使用ORMLite,需要自己写一个DatabaseHelper去继承OrmLiteSqliteOpenHelper,下面我们首先给出一个我认为比较靠谱的Helper的写法: 1.DatabaseHelper [java] view plaincopy package com.zhy.z

Android ORM系列之ActiveAndroid

从Java Web转到android的同学应该都知道ssh或者ssi,用惯了hibernate或者mybatis,转到android后找不到顺手的orm是不是感觉很不自在.其实android 中的orm还是很多的. ActiveAndroid SugarORM Siminov greenDAO ORMLite androrm cupboard 本篇文章主要介绍一下ActiveAndroid的用法.用过LitePal的同学会发现,这两个框架的用法是如此的相似. Active Record(活动目录

Android开发最佳实践---Futurice之见

原文链接:https://github.com/futurice/android-best-practices 本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重复制造轮子.如果你对iOS或者WindowsPhone开发感兴趣,那么也请看看iOS最佳实践和Windows客户端开发最佳实践. 第一版翻译自:http://blog.csdn.net/asce1885 Android开发技术日新月异, Github上也有较大更新, 故对原文有增删 CSDN的mar