现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。
官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
GreenDao特点
性能最大化,可能是Android平台上最快的ORM框架
易于使用的API
最小的内存开销
依赖体积小
支持数据库加密
强大的社区支持
GreenDao配置
// In your root build.gradle file: buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin } } // In your app projects build.gradle file: apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' // apply plugin dependencies { implementation 'org.greenrobot:greendao:3.2.2' // add library }
实体类:
实体类,不需要自己写get和set方法,在生成表的时候会自动生成。不要忘了在类名上标记@Entity注解
/** * * Created by zhanke on 2019/3/1 0009. * <p> */ @Entity //@Entity 将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类 public class User { //@Id:主键,通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的 @Id(autoincrement = true) private Long id; @NotNull// @NotNull 设置数据库表当前列不能为空 @Unique//唯一 private String name; //@Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name") @Property(nameInDb = "userage") private int age; //@Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化 @Transient private String like; }
@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值 。
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空 @Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
写好实体类之后Make Project 重新编译
初始化GreenDao
public class CustomApplication extends Application { public static final String DB_NAME = "app.db"; private static DaoSession mDaoSession; @Override public void onCreate() { super.onCreate(); initGreenDao(); } private void initGreenDao() { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, DB_NAME); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); mDaoSession = daoMaster.newSession(); } public static DaoSession getmDaoSession() { return mDaoSession; } }
添加数据
注意:Long型id,如果传入null,则GreenDao会默认设置自增长的值。
insert(User entity):插入一条记录, 当指定主键在表中存在时会发生异常
添加一条数据
CustomApplication.getmDaoSession().getUserDao().insert(user);
insertOrReplace(User entity) :当指定主键在表中存在时会覆盖数据,有该数据时则更新
save(User entity):
使用数据库插入数据时,使用insert会因为key值(通常是id)重复的异常。我们当然想通过一个简单的方法:有该数据时则更新,没有该数据时则插入的“有更无插”的方法,在GreenDao有两个方insertOrReplace和save,可两者时有区别的:
结论
insertOrReplace : 传入的对象在数据库中,有则更新无则插入。推荐同步数据库时使用该方法。
save 类似于insertOrReplace,区别在于save会判断传入对象的key,有key的对象执行更新,无key的执行插入。当对象有key但并不在数据库时会执行失败.适用于保存本地列表。
//key为null,插入
User user = new User(null, "xyh" , 120, "篮球");//key不为null,在数据库中有该key执行更新,在数据无无该key,不插入不更新
User user = new User(21l, "xyh333" , 120, "篮球"