Android ORM 框架:GreenDao的使用,只需看一遍就会

时间:2022-01-17 15:26:08

前言

这篇文章主要讲的是GreenDao的使用,可能初次接触到GreenDao的android开发者,对他并不熟悉,不知道这是个什么样的框架,提到这个框架,我需要提到的是android数据库开发经常会用的SQLite,相信很多人对这个并不陌生,知道它是干嘛用的,但是原生的SQLite在使用起来,并不是那么的方便,在效率上也没那么高,所以基于这一点,有很多的第三方的用于操作android数据库的框架涌现了出来,现在市面上比较优秀的主流框架有OrmLite、SugarORM、Active Android、Realm 与 GreenDAO,而今天我将选择GreenDao当主角,讲讲这个框架的特点以及如何快速的上手并用在自己的项目中。


关于GreenDao

Android ORM 框架:GreenDao的使用,只需看一遍就会
这个图片足以说明SQLite与GreenDao的关系,说白了,GreenDao 就是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

GreenDao的设计目标

  • 一个精简的库
  • 性能最大化
  • 内存开销最小化
  • 易于使用的 APIs
  • 对 Android 进行高度优化

GreenDao与OrmLite的比较

GreenDao的优点

1、效率很高,插入和更新的速度是sqlite的2倍;
2、加载实体的速度是ormlite的4.5倍,这里是官网测试结果
3、文件较小(<100K),占用更少的内存 ,但是需要create Dao;
4、操作实体灵活:支持get,update,delete等操作

GreenDao的缺点

学习成本较高。其中使用了一个java工程根据一些属性和规则去generate一些基础代码,类似于javaBean但会有一些规则,另外还有QueryBuilder、Dao等API,所以首先要明白整个过程,才能方便使用。没有ORMLite那样封装的完整,不过greenDao的官网上也提到了这一点,正是基于generator而不是反射,才使得其效率高的多。

OrmLite的优点

1、文档较全面;
2、社区活跃,有好的维护;
3、使用简单,易上手。

OrmLite的缺点

基于反射,效率较低


如何使用

第一步:创建Java工程
由于GreenDao的使用需要依赖一个Java工程,所以第一步先创建一个java工程,在android studio中创建的步骤看图
图一
Android ORM 框架:GreenDao的使用,只需看一遍就会
图二
Android ORM 框架:GreenDao的使用,只需看一遍就会
图三
Android ORM 框架:GreenDao的使用,只需看一遍就会
到这里,一个Java工程就创建好了

第二步:在Java工程项目的build.gradle文件里面添加如下依赖:

compile 'de.greenrobot:greendao-generator:2.1.0'

第三步:编写Java工程主代码

package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class GeneratorFortroy {

public static void main(String[] args){
// 创建Schema
Schema s = new Schema(1,"test.greendao.com.greendaotest.db");
// 添加实体对象
Entity user = s.addEntity("User");
// 给实体添加属性
user.addIdProperty().autoincrement();// 用户ID
user.addStringProperty("name"); // 姓名
user.addStringProperty("sex"); // 性别
user.addIntProperty("height"); // 身高
user.addIntProperty("age"); // 年龄

try {
// 创建Dao生成器生成所需要的对象和Dao对象,下面的参数一我就不说了,第二个参数是你要把所有的文件生成到的目标文件的文件路径,比如我这里是android项目所在的目录的java目录下
new DaoGenerator().generateAll(s,"C:\\Users\\zhangtao\\Desktop\\GreenDaoTest\\app\\src\\main\\java");
} catch (Exception e) {
e.printStackTrace();
}
}
}

经过以上三步,一个java工程项目已经完成,接下来需要创建android工程了,相信用过android studio的开发者对这个步骤并不陌生,我这里就不在赘述了,还不太熟悉的可以点这里进去学习。

第四步:在android项目的build.gradle的文件里引入依赖库

compile 'de.greenrobot:greendao:2.1.0'

第五步:运行刚才创建好的Java工程
Android ORM 框架:GreenDao的使用,只需看一遍就会
完成这一步,可以回头看看Android项目里面有没有一下这几个文件,如果有,表示数据库创建成功, 那么接下去就可以做数据库的增删改查测试了
Android ORM 框架:GreenDao的使用,只需看一遍就会

第六步:数据库的增删改查测试
布局文件activity_mian.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">


<Button
android:onClick="add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />

<Button
android:onClick="query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" />

<Button
android:onClick="update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改" />

<Button
android:onClick="delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除" />

</LinearLayout>

主代码MainActivity.java

package test.greendao.com.greendaotest;

import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.List;

import test.greendao.com.greendaotest.db.DaoMaster;
import test.greendao.com.greendaotest.db.DaoSession;
import test.greendao.com.greendaotest.db.User;
import test.greendao.com.greendaotest.db.UserDao;

public class MainActivity extends AppCompatActivity {

private static String TAG = MainActivity.class.getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

/**
* 添加
* @param v
*/

public void add(View v) {
DaoSession session = getSession();
UserDao dao = session.getUserDao();
for (int i = 0; i < 10; i++){
User user = new User();
user.setName("李四"+i);
user.setAge(19);
user.setSex("男");

dao.insert(user);
}
}

/**
* 查询
* @param v
*/

public void query(View v) {
DaoSession session = getSession();
UserDao dao = session.getUserDao();
List<User> users = dao.loadAll();
for (User user:users) {
Log.d(TAG, "testLoadAll: "+"姓名:"+user.getName());
Log.d(TAG, "testLoadAll: "+"性别:"+user.getSex());
Log.d(TAG, "testLoadAll: "+"年龄:"+user.getAge());
}
}

/**
* 修改
* @param v
*/

public void update(View v) {
DaoSession session = getSession();
UserDao dao = session.getUserDao();
User user = dao.loadByRowId(1);
user.setAge(34);
dao.update(user);
}

/**
* 删除
* @param v
*/

public void delete(View v) {
DaoSession session = getSession();
UserDao dao = session.getUserDao();
User user = dao.loadByRowId(1);
dao.delete(user);
}

/**
* 获取DaoSession
* @return DaoSession
*/

private DaoSession getSession(){
SQLiteDatabase db = new DaoMaster.DevOpenHelper(this,"user.db",null).getWritableDatabase();
DaoMaster dm = new DaoMaster(db);
return dm.newSession();
}
}