使用GreenDao对数据库进行操作

在gradle中进行如下配置

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}

apply plugin: 'org.greenrobot.greendao'

dependencies {
    compile 'org.greenrobot:greendao:3.0.1'
}

greenDAO特性

对象/关系映射(ORM)

greenDAO Android ORMgreenDAO的本质是提供一个面向对象的接口数据存储在关系数据库SQLite。 数据模型定义,greenDAO将创建Java数据对象(实体)和DAOs( 数据访问对象 )。 这将节省你很多无聊的代码,只是来回移动数据。 除此之外,greenDAO报价 一些先进的ORM特性 像一个会话缓存,立即加载和活跃的实体。

性能

orm我们知道,greenDAO是最快的。 关于性能greenDAO不做任何妥协。 数据库用于存储大量的数据,因此速度很重要。 使用greenDAO,大多数实体可以插入、更新和加载速度 每秒几千实体 

我们有信心在greenDAO性能和邀请你来比较greenDAO orm。 我们 开源的基准 完全透明。 下面的图表比较了3个最流行的Android greenDAO ORM解决方案,OrmLite,ActiveAndroid(根据基于GitHub的流行明星和Appbrain的统计数据)。 greenDAO插入和更新实体快2倍左右,并加载实体比ORMLite快4倍左右。 典型的应用程序加载速度是最相关的。

greenDAO-vs-OrmLite-vs-ActiveAndroid
除了greenDAO的高性能核心功能,如一个会话缓存和智能立即加载技术给额外的性能提升。

加密支持

您可以使用与标准greenDAO SQLite,嵌入在Android,或与SQLCipher您可以使用它。 有看吗 数据库加密文档获取详细信息。

很小的library

greenDAO核心库的规模小于100 k,所以添加greenDAO不伤害你的APK大小。

活跃的实体

如果你愿意的话,实体可以“活跃”:积极解决实体关系透明(你只是调用getter),更新,删除和更新方法方便访问持久化功能。

Protocol buffers支持

greenDAO让你坚持 协议缓冲区(protobuf) 直接对象到数据库中。 如果你跟你的服务器通过protobuf,你不需要另一个映射。 常规实体的所有持久化操作可用于protobuf对象。 我们相信这是greenDAO的一个独特的特征。

代码生成

greenDAO将生成Java数据对象(实体)和DAO对象。 DAO对象是根据实体允许最好的映射。 
未来计划:生成适配器,也许CRUD活动。

开源

在G greenDAO的源代码是完全可用 itHub 。 源分布还包含一个JUnit测试套件,它使用greenDAO的所有功能,因此对greenDAO学习的极好途径。

在项目中如何使用GreenDao进行操作。

先新建一个Java类型的Module,选择File -> New -> New Module ,类型选择Java Library ,当然库名、包名和类名随便啦。我这里起的名字如下:库名–greendaogenerator,包名-com.lanou3g.greenrobot,类名-ExpDaoGrnerator; 

新建一个Module

类型选择Java Library
3.添加这个Java Module的GreenDao依赖,打开Java库下面的build.gradle文件,添加如下依赖:
 compile ‘de.greenrobot:greendao-generator:2.0.0’
4.打开Java文件,写入如下内容:
package com.lanou3g.greenrobot;

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

public class ExpDaoGenerator {

    public static void main(String[] args) {
        // 创建Schema对象
        // 构造方法第一个参数为数据库版本号
        // 第二个参数为自动生成的实体类将要存放的位置,前面为我的Android Module的包名
        Schema schema = new Schema(1000, "com.lanou3g.greendaodemo.entity.greendao");
        // 添加需要创建的实体类信息
        addNote(schema);
        try {
            // 创建实体类.第二个参数填Android Module的路径
            new DaoGenerator().generateAll(schema, "./AppExample/src/main/java");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加将要创建的实体类的信息,会根据类名生成数据库的表,属性名生成数据库的字段

* 当然如果想建多张表,可以创建多个Entity对象 * * @param schema */ private static void addNote(Schema schema) { // 指定需要生成实体类的类名,类名确定了那么表名也是根据这个类名来自动命名的,例如下面这个,生成的表名叫做person_entity Entity entity = schema.addEntity("PersonEntity"); // 指定自增长主键 entity.addIdProperty().autoincrement().primaryKey(); // 添加类的属性,根据属性生成数据库表中的字段 entity.addStringProperty("name"); entity.addIntProperty("age"); entity.addStringProperty("sex"); } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
在java文件上面右键,选择Run’ExpDaoGenerator main()’,运行后,会在Android Module下面的相应包下生成一系列的java类文件,如下图:

生成的类文件

至此,Java程序的作用就结束了,可以退休了,下面是在Android Module中的使用方式了

5.打开Android Module,默认名字叫app,我这里改成了AppExample,打开这里面的build.gradle文件,添加依赖如下:

compile ‘de.greenrobot:greendao:2.0.0’

跟刚才Java那个不一样是吧,看出区别来了吧;
6.进行数据库中对应表的操作,需要进行一系列的初始化,看代码:
public class MainActivity extends AppCompatActivity {
    /** 省略一些控件的声明 */
    // 数据库
    private SQLiteDatabase db;
    // 管理者
    private DaoMaster mDaoMaster;
    // 会话
    private DaoSession mDaoSession;
    // 对应的表,由java代码生成的,对数据库内相应的表操作使用此对象
    private PersonEntityDao personDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDatabase();
    }

    private void initDatabase() {
        // 初始化就这个顺序,记着吧 ^_^
        // 此DevOpenHelper类继承自SQLiteOpenHelper,第一个参数Context,第二个参数数据库名字,第三个参数CursorFactory
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"daodemo.db",null);
        db = helper.getWritableDatabase();
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
        PersonEntityDao personDao = mDaoSession.getPersonEntityDao();

        // 删除表内所有数据(我为什么要写这个方法...太简单了吧也),写入前先清空一下,防止id冲突导致报错
        personDao.deleteAll();

        // 下面对数据库内的表进行操作
        // 首先模拟一些数据
        List personList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            PersonEntity person = new PersonEntity((long) i,"孙悟空"+i,20+i,"男");
            // 使用这个方法可以一条一条的写入数据库
            personDao.insert(person);
            // 插入或者替换单条数据,就是id重复也可以使用
//            personDao.insertOrReplace(person);
            personList.add(person);
        }
        // 这个方法可以将一个集合直接写入数据库,很方便
//        personDao.insertInTx(personList);
        // 看名字也知道是干嘛的了吧,把数据写入,或者替换
//        personDao.insertOrReplaceInTx(personList);
        // 根据id删除数据 - -! 我真的一定要写出来么
        personDao.deleteByKey(3l);
        // 更新表内元素
        personDao.update(new PersonEntity(5l,"贝吉塔",100,"男"));
        // 查表,结果直接返回到链表中,下面的三种方法都可以进行查表操作,将所有信息都查出来
        List queryList = personDao.queryBuilder().list();
//        queryList = personDao.queryBuilder().listLazy();
//        queryList = personDao.loadAll();
        // 输出结果,看一下
        for (PersonEntity personEntity : queryList) {
            Log.d("TAGGG",personEntity.getName());
        }

    }
    private void initView() {
       /** 初始化控件的,没什么用,省略了 */
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

下面看一下数据库内的内容: 
数据库内插入的内容 
可以看到id为3的那一条数据被删除掉了,id为5的那一条数据被修改了;

再看一下Logcat输出内容: 
logcat输出查表结果

可以看到,数据成功的查找出来了;

7.很多界面都这么写数据库肯定会很麻烦嘛,所以需要使用单例.我就简单写一个了,见笑啦,代码如下


public class DaoSingleton {

    private static final String DATABASE_NAME = "daodemo.db";

    private volatile static DaoSingleton instance;

    private SQLiteDatabase db;
    private DaoMaster daoMaster;
    private DaoSession daoSession;
    private Context context;
    private DaoMaster.DevOpenHelper helper;
    private PersonEntityDao personDao;

    private DaoSingleton() {
        context = BaseApplication.getContext();
    }

    public static DaoSingleton getInstance() {
        if (instance == null) {
            synchronized (DaoSingleton.class){
                if (instance == null) {
                    instance = new DaoSingleton();
                }
            }
        }
        return instance;
    }

    public DaoMaster.DevOpenHelper getHelper() {
        if (helper == null) {
            helper = new DaoMaster.DevOpenHelper(context,DATABASE_NAME,null);
        }
        return helper;
    }

    private SQLiteDatabase getDb(){
        if (db == null) {
            db = getHelper().getWritableDatabase();
        }
        return db;
    }

    private DaoMaster getDaoMaster() {
        if (daoMaster == null) {
            daoMaster = new DaoMaster(getDb());
        }
        return daoMaster;
    }

    public DaoSession getDaoSession() {
        if (daoSession == null) {
            daoSession = getDaoMaster().newSession();
        }
        return daoSession;
    }

    public PersonEntityDao getPersonDao() {
        if (personDao == null) {
            personDao = getDaoSession().getPersonEntityDao();
        }
        return personDao;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

里面用到的Context使用的是Application的,防止单例类长时间持有其他Activity的Context,影响性能;使用的话,直接在代码中调用

PersonEntityDao personDao = DaoSingleton.getInstance().getPersonDao();
  • 1

来获取对象; 


你可能感兴趣的:(Android开发)