废话不多说,今天我们来学习:开源的Android数据库ORM框架——greenDAO。


GreenDao介绍

greenDAO是Android的一个对象/关系映射(ORM)工具。它为关系数据库SQLite提供面向对象的界面。

Android greendao id自增 安卓greendao_greenDao

了解更多,详见官网:http://greenrobot.org/greendao
github地址:https://github.com/greenrobot/greenDAO


GreenDao优点

  • 性能最大化(Android平台最快的ORM框架)
  • 简洁直观的API
  • 支持SQLCipher加密数据库
  • 依赖体积小
  • 内存开销最小化
  • 对Android进行高度优化

GreenDao的使用

在Android Studio项目 build.gradle(Project:项目名称)文件中引入:

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}

在 build.gradle(Module.app)文件中引入:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

...

//greendao配置
greendao {
    schemaVersion 1  //数据库版本号
    daoPackage 'app.hjw.com.greendao.gen' //生成Dao,DaoMaster和DaoSession的包名(默认实体的包名)
    targetGenDir 'src/main/java' //自定义生成源文件的路径
}

dependencies {
    ...
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

编写代码示例

创建User实体类中的代码

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    @NotNull
    private String name;
    @NotNull
    private int age;
    @Transient
    private int tempUsageCount;

    ...
}

MakeProject

编译项目,自动编译User实体类,并在User类中生成get、set方法以及在app.hjw.com.greendao.gen目录下生成三个文件,如下:

Android greendao id自增 安卓greendao_greenDao_02

编写Application中的代码

public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    public static MyApplication instances;

    public static MyApplication getInstances() {
        return instances;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDataBase();

    }

    private void setDataBase() {
        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        //通过DaoMaster.DevOpenHelper得到SQLiteOpenHelper对象
        db = mHelper.getWritableDatabase();
        //该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getmDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }
}

最后不要忘记在我们的AndroidManifest.xml中指定MyApplication。

在MainAcitivity中onCreate获取Dao对象

daoSession = MyApplication.getInstances().getmDaoSession();
 userDao = daoSession.getUserDao();

Insert

private void insertData() {
        User user = new User();
        try {
            user.setName("hjw");
            user.setAge(23);
            userDao.insert(user);
            Log.d(TAG, "insertData: " + user.getId());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当我们点击Insert按钮,观察日志如下:

Android greendao id自增 安卓greendao_面向对象_03

Delete

根据条件删除数据:

private void deleteData(long id) {

        List<User> userList = null;
        try {
            userList = (List<User>) userDao.queryBuilder().where(UserDao.Properties.Id.le(id)).build().list();
            for (User user : userList) {
                userDao.delete(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当我们点击Delete按钮,就可以根据Id删除想要删除的数据。

首先我们通过where查询条件,这里id传入的小于等于id的数据,where可以有多个参数(多个查询条件),最后list()表示查询结果是一个List集合。(unique表示查询一条数据)。

根据主键删除:

private void deleteDataById(long id){
        userDao.deleteByKey(id);
    }

删除所有的数据:

private void deleteDataAll() {
        userDao.deleteAll();
    }

Update

根据Id修改数据:

private void updateData(long id) {

        try {
            User user = new User(id,"hxn",18);
            userDao.update(user);
            Log.d(TAG, "updateData: " + user.getName());
        } catch (Exception e) {
            Log.d(TAG, "updateData failed" + e.getMessage());
        }

    }

当我们点击Update按钮,观察日志如下:

Android greendao id自增 安卓greendao_面向对象_04

Query

查询全部数据:

private void queryAll() {

        try {
            List<User> users = userDao.loadAll();
            for (User u : users) {
                Log.d(TAG, "queryAll: "
                        + "  id:" + u.getId()
                        + "  name" + u.getName()
                        + "  age" + u.getAge());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

当我们点击Query按钮时,观察打印日志如下:

Android greendao id自增 安卓greendao_User_05

查询单个数据:

private void queryByName() {
        User hjw = userDao.queryBuilder().where(UserDao.Properties.Name.eq("hjw")).unique();
        Log.d(TAG, "queryByName: " + "  name" + hjw.getName() + "  age" + hjw.getAge() + "  id" + hjw.getId());
    }

数据库升级

升级数据库分为两个步骤:

  • 修改gradle
    首先module中的gradle文件中修改数据库的版本号:
schemaVersion 2  //最新版本号
  • 修改实体类(比如增加或删除字段)

最后我们MakeProject编译项目即可。一般的数据库升级这样就可以了,特殊情况可能需要自己编写数据库迁移脚本。


注解

实体@Entity注解

schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表

基础属性注解

@Id :主键 Long型,通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
@NotNul:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列

索引注解

@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束

关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系

总结

本教程主要总结了GreenDao基本语法和配置,欢迎童鞋们学习。
最后附上源代码地址:https://github.com/HjwJack/GreenDao