适用于 Android 主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。在近期的项目开发中再次采用greenDao作为数据库模块的解决方案,今天我将详解地介绍如何在 Android Studio 上使用 greenDAO。
compile 'de.greenrobot:greendao:2.1.0'
1)与buildTypes节点并列,增加sourceSets内容,如下。
buildTypes {
...
}
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/java-gen']
}
2)compile greenDao2
compile 'de.greenrobot:greendao:2.1.0'
在当前项目中,新建一个 java 项目作为一个module,步骤如下:
(1)New Module选择Java Library,项目名称为:greendao_java,main类名称为Generator,如下图所示。
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//新增
compile 'de.greenrobot:greendao-generator:2.1.0'
}
(3)编写Generator类代码如下,并运行。Android Studio运行java项目需要进行配置,参考第四步。
package com.example;
import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;
public class Generator {
//数据库版本
private static int version = 1;
//生成的bean文件存放路径
private static String defaultPackage = "com.huatec.edu.bean";
//生成的dao、session等文件的存放路径
private static String getDefaultPackageDao = "com.huatec.edu.dao";
//生成的代码存储路径,这里使用的是相对路径
private static String outUri = "./app/src/main/java-gen";
public static void main(String[] args) throws Exception {
//创建模式对象,指定版本号和自动生成的bean对象的包名
Schema schema = new Schema(version, defaultPackage);
//指定自动生成的dao对象的包名,不指定则都DAO类生成在"test.greenDAO.bean"包中
schema.setDefaultJavaPackageDao(getDefaultPackageDao);
//添加实体
addStudent(schema);
addTeacher(schema);
//调用DaoGenerator().generateAll方法自动生成代码到之前创建的java-gen目录下
new DaoGenerator().generateAll(schema, outUri);
}
private static void addStudent(Schema schema) {
//添加一个实体,则会自动生成实体Student类
Entity entity = schema.addEntity("Student");
//指定表名,如不指定,表名则为 Student(即实体类名)
entity.setTableName("student");
entity.addIdProperty().autoincrement();//添加Id,自增长
entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
entity.addIntProperty("age");//添加Int类型的age
entity.addDoubleProperty("score");//添加Double的score
entity.addStringProperty("school");
}
private static void addTeacher(Schema schema) {
Entity entity = schema.addEntity("Teacher");
entity.addIdProperty().autoincrement();
entity.addStringProperty("name").notNull();
entity.addIntProperty("age");
}
}
这里我新建了两个实体类,也就是新建了两个数据表,实体类的成员变量名就是表的字段,如果想要新建更多的表可以参考上面的形式。
(4)运行java项目
在Android Studio中想要运行Java项目,需要配置才行。依次打开菜单“Run”——“Edit Configurations”,弹出“Run/Debug Configurations”窗体。
在app module下新建MyApplication类,配置数据库的基本信息,示例代码如下。
public class MyApplication extends Application {
public DaoSession daoSession;
public SQLiteDatabase db;
public DaoMaster.DevOpenHelper helper;
public DaoMaster daoMaster;
@Override
public void onCreate() {
super.onCreate();
setupDatabase();
}
//配置数据库
private void setupDatabase() {
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
/**
* TODO 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。将原来数据库的数据迁移到新的数据库中。
*/
helper = new DaoMaster.DevOpenHelper(this, "myDb", null);
//得到数据库连接对象
db = helper.getWritableDatabase();
//得到数据库管理者
daoMaster = new DaoMaster(db);
//得到daoSession,可以执行增删改查操作
daoSession = daoMaster.newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
就拿StudentDao类来说,它是自动生成的类,该类继承自AbstractDao,在该基类中定义了数据库的常用基本操作。所以,实际上使用greenDao来进行增删改查就变得很简单。
/**
* 插入
*/
private void addEntity() {
if (!TextUtils.isEmpty(name)) {
Student entity = new Student(null, name, age, score, school);
//面向对象添加表数据
studentDao.insert(entity);
cursor.requery();//刷新
} else {
Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
}
}
/**
* 根据id删除
*
* @param id
*/
private void deleteEntity(long id) {
studentDao.deleteByKey(id);
cursor.requery();
}
/**
* 更新
*/
private void updateList() {
Student entity = new Student(id, name, age, score, school);
studentDao.update(entity);
cursor.requery();
}
/**
* 根据name查询
*
* @param name
*/
private void query(String name) {
if (!TextUtils.isEmpty(this.name)) {
// Query 类代表了一个可以被重复执行的查询
Query<Student> query = studentDao.queryBuilder()
.where(StudentDao.Properties.Name.eq(this.name))
.orderAsc(StudentDao.Properties.Id)
.build();
// 查询结果以 List 返回
List count = query.list();
Toast.makeText(MainActivity.this, count.size() + "条数据被查到", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
}
}
/**
* 查询全部
*/
private void queryAll() {
// Query 类代表了一个可以被重复执行的查询
Query<Student> query = studentDao.queryBuilder()
.orderAsc(StudentDao.Properties.Id)
.build();
// 查询结果以 List 返回
List count = query.list();
Toast.makeText(MainActivity.this, count.size() + "条数据被查到", Toast.LENGTH_SHORT).show();
}