一、greenDAO简介
greenDAO是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到SQLite数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。
greenDAO项目地址:https://github.com/greenrobot/greenDAO
二、greenDAO特征
1、对象映射( ORM)
greenDAO是ORM 框架,可以非常便捷的将Java 对象映射到 SQLite 数据库中保存。
2、高性能
ORM 框架有很多,比较著名的有 OrmLite , ActiveAndroid 等
greenDAO官方给出了这三者的性能对比。
greenDAO、OrmLite、ActiveAndroid的对比图
3、支持加密
三、greenDAO集成
1、设置仓库与插件(Project: build.gradle)
1 buildscript {
2 repositories {
3 jcenter()
4 mavenCentral() // add repository
5 }
6 dependencies {
7 classpath 'com.android.tools.build:gradle:3.0.1'
8 classpath 'org.greenrobot:greenDAO-gradle-plugin:3.2.2' // add plugin
9 }
10 }
2、配置依赖 ( Module:app build.gradle )
1 apply plugin: 'com.android.application'
2 apply plugin: 'org.greenrobot.greenDAO' // apply plugin
3
4 dependencies {
5 compile 'org.greenrobot:greenDAO:3.2.2' // add library
6}
3、配置数据库相关信息 ( Module:app build.gradle )
1 greenDAO{
2 schemaVersion 1 //数据库版本号
3 daoPackage 'com.book.aikaifa.tallybook.gen''
4 targetGenDir 'src/main/java'
5 }
6
4、Sync Project with Gradle Files 同步工程 即可
四、greenDAO案例
1、新建实体类(User)
1 @Entity
2 public class User {
3 @Id
4 private long id;
5 private String name;
6 private int age;
7}
注解详解
@Entity
表明这个实体类会在数据库中生成一个与之相对应的表
属性:
schema:告知greenDAO当前实体属于哪个 schema
schema active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
nameInDb:在数据库中使用的别名,默认使用的是实体的类名,
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表(默认:true)
generateConstructors 自动创建全参构造方法(同时会生成一个无参构造方法)(默认:true)
generateGettersSetters 自动生成 getters and setters 方法(默认:true)
1 @Entity(
2 schema = "myschema",
3 active = true,
4 nameInDb = "AWESOME_USERS",
5 indexes = {
6 @Index(value = "name DESC", unique = true)
7 },
8 createInDb = true,
9 generateConstructors = false,
10 generateGettersSetters = true
11 )
12 public class User {
13 ...
14}
@Id
对应数据表中的 Id 字段
@Index
使用@Index作为一个属性来创建一个索引,默认是使用字段名
1 @Entity
2 public class User {
3@Id
4private Long id;
5
6@Index(unique = true)
7private String name;
8}
@Property
设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "userName")
@NotNull
设置数据库表当前列不能为空
@Transient
添加此标记后不会生成数据库表的列
@Unique
表名该属性在数据库中只能有唯一值
1 @Entity
2 public class User {
3@Id
4private Long id;
5@Unique
6private String name;
7}
@ToOne
表示一对一关系
@Entity
public class Order {
@Id private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@Entity
public class Customer {
@Id
private Long id;
}
@OrderBy
更加某一字段排序 ,例如:@OrderBy("date ASC")
@ToMany
定义一对多个实体对象的关系
1 @Entity
2 public class Customer {
3 @Id private Long id;
4 @ToMany(referencedJoinProperty = "customerId")
5 @OrderBy("date ASC")
6 private List orders;
7 }
8
9 @Entity
10 public class Order {
11 @Id private Long id;
12 private Date date;
13 private long customerId;
14 }
2、Make Project编译工程
会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。
3、初始化greenDAO
( 通常在 Application中初始化)
1public class MyApplication extends Application {
2 public static MyApplication application;
3 private static Context context;
4 private MyOpenHelper mHelper;
5 private SQLiteDatabase db;
6 private DaoMaster mDaoMaster;
7 private DaoSession mDaoSession;
8
9@Override
10public void onCreate() {
11 super.onCreate();
12 application = this;
13 context = getApplicationContext();
14 setDatabase();
15}
16
17public static MyApplication getApplication() {
18 return application;
19}
20
21private void setDatabase() {
22 mHelper = new MyOpenHelper(this, "book-db", null);
23 db = mHelper.getWritableDatabase();
24 mDaoMaster = new DaoMaster(db);
25 mDaoSession = mDaoMaster.newSession();
26}
27
28public DaoSession getDaoSession() {
29 return mDaoSession;
30}
31
32public SQLiteDatabase getDb() {
33 return db;
34}
35 }
4、获取UserDao
userDao = MyApplication.getApplication().getDaoSession().getUserDao();
5、添加记录
添加单条记录
User user;
userDao.insert(user);
插入一组数据
List<User> listUser;
userDao.insert(listUser);
插入或替换数据
根据主键来判断
User user;
userDao.insertOrReplace(user)
List<User> listUser;
userDao.insertOrReplace(listUser);
6、删除记录
删除单条记录
User user;
userDao.delete(user);
删除一组数据
List<User> listUser;
userDao.deleteInTx(listUser);
删除所有数据
userDao.deleteAll();
7、修改记录
修改单条记录
User user;
userDao.update(user);
修改一组数据
List<User> listUser;
userDao.updateInTx(listUser);
8、查找记录
查询全部记录
userDao.loadAll()
查询数量
int count = userDao.count();
条件查询
精确查询(where)
//查询电影名为“肖申克的救赎”的电影
User user=
userDao.queryBuilder().where(UserDao.Properties.Name.eq("aikaifa")).unique();
//查询年纪在30岁的人群
List<User > userList=
userDao.queryBuilder().where(UserDao.Properties.Age.eq(30)).list();
模糊查询(like)
//查询以“洪”开头的用户
userDao.queryBuilder().where(UserDao.Properties.Name.like("洪%")).list();
区间查询
gt 大于
ge 大于等于
lt 小于
le 小于等于
Between 介于中间
升降序
orderAsc 升序
orderDesc 降序
and /or
五、greenDAO案例
细心的你,我们在Application初始化时,有这样一句 mHelper = new MyOpenHelper(this, "book-db", null);
其中MyOpenHelper是用来辅助升级的
1public class MyOpenHelper extends DaoMaster.OpenHelper {
2public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
3 super(context, name, factory);
4}
5
6@Override
7public void onUpgrade(Database db, int oldVersion, int newVersion) {
8 MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
9 @Override
10 public void onCreateAllTables(Database db, boolean ifNotExists) {
11 DaoMaster.createAllTables(db, ifNotExists);
12 }
13
14 @Override
15 public void onDropAllTables(Database db, boolean ifExists) {
16 DaoMaster.dropAllTables(db, ifExists);
17 }
18 }, UserDao.class);
19}
20 }
其中MigrationHelper 来进行数据库升级以及数据迁移。它主要是通过创建一个临时表,将旧表的数据迁移到新表中。关于MigrationHelper 源码可以参考https://github.com/yuweiguocn/GreenDaoUpgradeHelper
另外还有DAOMaster、DAOSession。DAOMaster主要是负责数据库创建和升级,DAOSession负责获得实体类的UserDAO,来进行增删改查。
【END】
近期精选推荐
分享职场攻略、技术心得和创业资源
更多精彩内容,请长按识别关注