GreenDao3.x使用介绍

在本文中我只记录了我认为重要的, 旨在先创建一个简单的demo能把greendao的一些基础的功能用起来, 可能并不详细, 理解可能也有错误, 如果您想看详细而全面的介绍, 请移步官网, 如果您对本文有任何疑问或者建议, 请随时@我

greendao官网:
http://greenrobot.org/greendao
数据库升级:
https://github.com/yuweiguocn/GreenDaoUpgradeHelper

配置build.gradle

project–>build.gradle:
这里写图片描述

app–>build.gradle:
这里写图片描述
这里写图片描述

schemaVersion: 数据库版本号
daoPackage: 在指明的gen目录下自己定义生成的dao等文件的存放位置
targetGenDir: 指明gen目录

使用

在application中初始化, 避免重复创建DaoSession对象

public class MyApp extends Application {

    private static MyApp myApp;
    private DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        myApp = this;
        initDao();
    }

    private void initDao() {
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以在正式的项目中,应该做一层封装,来实现数据库的安全升级, 
        // 创建MySQLiteOpenHelper类继承DaoMaster.OpenHelper, 重写onUpgrade方法来实现安全升级
        MigrationHelper.DEBUG = true; //如果你想查看日志信息,请将DEBUG设置为true
        MySQLiteOpenHelper mHelper = new MySQLiteOpenHelper(this, "db_test", null);
        DaoMaster mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
        daoSession = mDaoMaster.newSession();
    }

    public static MyApp getInstance(){
        return myApp;
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }

}

MySQLiteOpenHelper类:

public class MySQLiteOpenHelper extends OpenHelper {

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    public MySQLiteOpenHelper(Context context, String name) {
        super(context, name);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        MigrationHelper.migrate(db,UserDao.class, PersonalDao.class);
    }
}

实体

@Entity
public class User {

    // 主键,autoincrement设置自增
    @Id(autoincrement = true)
    protected Long id;

    // 列名,默认使用变量名。默认变化举例:userName --> USER_NAME
//    @Property(nameInDb = "USERNAME")
    // 非空
    @NotNull
    protected String userName;

    // 忽略,不持久化(即不写入数据库),可用关键字transient替代
//    @Transient
    protected String pwd;

    // 索引,unique设置唯一,name设置索引别名
    @Index(unique = true)
    protected long userCardId;

    @ToOne(joinProperty = "userCardId")
    protected Phone phone;

    @ToMany(referencedJoinProperty = "userId")
    private List<Son> sons;
}
@Entity
public class Phone {
    @Id(autoincrement = true)
    private Long id;
    private long phoneId;
    private double price;
}
@Entity
public class Son {

    @Id(autoincrement = true)
    private Long id;
    private long userId;
    @NonNull
    private String sonName;
    @Unique
    private long sonCardId;
}

关于实体类定义有以下几点要说:
1. 注意注解标签的使用, 特别是ToOne和ToMany的使用;
2. 如果id定义为自增长, 那么id不需要传递, 可以自定义构造方法;

插入一条数据举例:

        daoSession = MyApp.getInstance().getDaoSession();
        phoneDao = daoSession.getPhoneDao();
        Phone phone = new Phone(123, 2000.00);
        phoneDao.insert(phone);

如果是插入一组数据:

        List<Son> sonList = new ArrayList<>();
        Son son1 = new Son("女儿"+index, 20001010L+index);
        son1.setUserId(user.getId());
        Son son2 = new Son("儿子"+index, 30001010L+index);
        son2.setUserId(user.getId());
        sonList.add(son1);
        sonList.add(son2);
        sonDao.insertInTx(sonList);

所有的curd方法都可在Dao对象中找到
常用方法:

insert/insertInTx/insertOrReplace/insertOrReplaceInTx
delete/deleteByKey/deleteAll
update/updateInTx
load/loadByRowId/loadAll

查询举例:

List users = userDao.queryBuilder()  // 查询 User
                .where(Properties.FirstName.eq("pan"))  // first那么等于pan
                .orderAsc(Properties.LastName)  // lastName升序排列
                .list();

当然不止where和orderASC, 还有很多API, 比如limit/orderDesc/and/or等等


关于ToOne和ToMany的使用

官方关于ToOne和ToMany的介绍:
http://greenrobot.org/greendao/documentation/relations/

当我make project后, 发现在User类中没有setSons(List sons)这样的方法, 我当时很疑问, 如果没有set方法, 我的sonList应该如何放入user对象中并插入数据库, 最后我看了下User类中greendao自动生成的setPhone(@NotNull Phone phone)/getPhone()/getSons()这三个方法, 我突然明白应该怎么用了, 就是User类并不负责ToOne和ToMany修饰的对象的存储工作, 每个对象应该自己负责自己的存储工作, 而不是交给其他人, 就算是setPhone方法, 其也只是需要拿到phone对象的id而已, 这是一开始的逻辑惯性导致思维误区, 举例说明:

        Phone phone = new Phone(123, 2000.00);
        phoneDao.insert(phone);

        user = new User("userName"+index, "pwd"+index, 10001010L+index);
        // 存储之前调用setPhone方法把phone表和user表关联起来,
        // 如果不调用, user.getPhone()获取的只会是空值
        user.setPhone(phone);
        userDao.insert(user);

        List<Son> sonList = new ArrayList<>();
        Son son1 = new Son("女儿"+index, 20001010L+index);
        // setUserId方法的调用把son表和user表关联起来, 如果son在存储之前不调用这个方法来传入正确的数据, 
        // 那么我们在调用user.getSons()方法获取的只会是一个空值
        son1.setUserId(user.getId());
        Son son2 = new Son("儿子"+index, 30001010L+index);
        son2.setUserId(user.getId());
        sonList.add(son1);
        sonList.add(son2);
        sonDao.insertInTx(sonList);//自己的存储工作自己负责

数据库升级

如果我们为entity增减了成员变量, 意味着我们需要升级数据库, 不然项目运行会报错, 修改entity后make project, 修改gradle中schemaVersion的值比之前的大, 再运行就不会出错了, 意味着升级成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值