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 plugin34 dependencies {5 compile 'org.greenrobot:greenDAO:3.2.2' // add library6}
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 @Entity2 public class User {3 @Id4 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 = true11 )12 public class User {13 ...14}
@Id
对应数据表中的 Id 字段
@Index
使用@Index作为一个属性来创建一个索引,默认是使用字段名
1 @Entity2 public class User {3@Id4private Long id;56@Index(unique = true)7private String name;8}
@Property
设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "userName")
@NotNull
设置数据库表当前列不能为空
@Transient
添加此标记后不会生成数据库表的列
@Unique
表名该属性在数据库中只能有唯一值
1 @Entity2 public class User {3@Id4private Long id;5@Unique6private 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 @Entity2 public class Customer { 3 @Id private Long id; 4 @ToMany(referencedJoinProperty = "customerId") 5 @OrderBy("date ASC") 6 private List orders; 7 } 8 9 @Entity10 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@Override10public void onCreate() {11 super.onCreate();12 application = this;13 context = getApplicationContext();14 setDatabase();15}1617public static MyApplication getApplication() {18 return application;19}2021private void setDatabase() {22 mHelper = new MyOpenHelper(this, "book-db", null);23 db = mHelper.getWritableDatabase();24 mDaoMaster = new DaoMaster(db);25 mDaoSession = mDaoMaster.newSession();26}2728public DaoSession getDaoSession() {29 return mDaoSession;30}3132public SQLiteDatabase getDb() {33 return db;34}35 }
4、获取UserDao
userDao = MyApplication.getApplication().getDaoSession().getUserDao();
5、添加记录
添加单条记录
User user;
userDao.insert(user);
插入一组数据
List
userDao.insert(listUser);
插入或替换数据
根据主键来判断
User user;
userDao.insertOrReplace(user)
List
userDao.insertOrReplace(listUser);
6、删除记录
删除单条记录
User user;
userDao.delete(user);
删除一组数据
List
userDao.deleteInTx(listUser);
删除所有数据
userDao.deleteAll();
7、修改记录
修改单条记录
User user;
userDao.update(user);
修改一组数据
List
userDao.updateInTx(listUser);
8、查找记录
查询全部记录
userDao.loadAll()
查询数量
int count = userDao.count();
条件查询
精确查询(where)
//查询电影名为“肖申克的救赎”的电影
User user=
userDao.queryBuilder().where(UserDao.Properties.Name.eq("aikaifa")).unique();
//查询年纪在30岁的人群
List
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 @Override10 public void onCreateAllTables(Database db, boolean ifNotExists) {11 DaoMaster.createAllTables(db, ifNotExists);12 }1314 @Override15 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,来进行增删改查。