greendao使用流程

转载自http://www.androidchina.net/3472.html

一.greendao依赖jar包下载地址:

http://search.maven.org/#search%7Cga%7C1%7CgreenDao
下载下载greendao-generator 和greendao的最新稳定版本

http://mvnrepository.com/artifact/org.freemarker/freemarker
下载freemarker的最新稳定版本

二.使用步骤:
1.添加依赖jar包依赖:copy到libs文件夹下,右键run as jar

2.创建包(可在任意包下):model,dao,generator,如下图:
这里写图片描述

3.在包genarator下,创建类GreenDaoGenerator.java,内容如下:

> public class GreenDaoGenerator {
> 
         public static void main(String[] args) throws Exception {
          //1为数据库的版本号,升级数据库的话需修改此处
     //  第二个参数为生成model相关类的包名
     // 两个参数均可以根据个人需要修改
        Schema schema = new Schema(1,"cn.wulincui.databasestudy.model");

   /*参数为实体类的生成包名*/  schema.setDefaultJavaPackageDao("cn.wulincui.databasestudy.dao");

     //可使由generator生成的代码中,根据个人需要添加自己的代码,再次重新生成代码时,这些个人需要添加的代码不会被清除,使用后代码中会有如下代码段:
 // KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END
 schema.enableKeepSectionsByDefault();

        //schema.enableActiveEntitiesByDefault();
        //ActiveRecord
        addEntity(schema);
        new DaoGenerator().generateAll(schema, "./app/src/main/java");
    }
    //添加实体类,以下代码创建了两张表,person和card
    //一个人有一张身份证,一张身份证对应一个人,这两者的关系是一对一。下面我们生成这两个实体类,并进行一对一映射。
    private static void addEntity(Schema schema) {
    //Person为实体类类名也是表名
        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");

//person和card建立了一一对应的表关系
        Property idcardPK = person.addLongProperty("cardId").getProperty();
        person.addToOne(card, idcardPK);

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

4.generator类写好后在此类上右键run,执行此类的main方法
控制台输出

This program comes with ABSOLUTELY NO WARRANTY
Processing schema version 1…
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\dao\PersonDao.java
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\model\Person.java
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\dao\CardDao.java
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\model\Card.java
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\dao\DaoMaster.java
Written D:\hulucode2\DataBaseStudy\app\src\main\java\cn\wulincui\databasestudy\dao\DaoSession.java
Processed 2 entities in 194ms

到此dao(实体类)和model(与数据库相关的操作方法)创建成功。

下面代码为方便使用数据库个人写的service类

核心辅助类:

public class DbCore {
    private static DaoMaster daoMaster;
    private static DaoSession daoSession;

    private static Context mContext;
    private static String DB_NAME;

//使用前初始化数据库名称,方便创建以用户id创建数据库名的项目
    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);
            //当调用SQLiteOpenHelper的getWritableDatabase()
            // 或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,
            // 如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    public static DaoSession getDaoSession() {
        if (daoSession == null) {
            if (daoMaster == null) {
                //创建数据库,创建表
                daoMaster = getDaoMaster();
            }
            //将db传到dao类,方便dao对数据库的操作
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    public static void enableQueryBuilderLog(){

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

基础泛型service

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);
    }
}

BaseService的实现类:

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;
    }
}

注意,在第一次创建数据库时,首先调用 DbCore.init(this,”1234”);传入数据库名称。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值