android的存储GreenDao数据库

数据库更新

思路;创建临时表-->删除原表-->创建新表-->复制临时表数据到新表并删除临时表;这样数据库表的更新就完成了

 

 

 

PRIMARY KEY must be unique (code 19)  GreenDao要想使用递增Id需要

@Id(autoincrement = true)
private Long id;

必须为Long这是个坑,当初使用long报错

-------混淆-------------------------------------------------------------------

-keep class de.greenrobot.dao.** {*;}

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
    public static java.lang.String TABLENAME;
}
-keep class **$Properties

 

 

1,在app_build中加入依赖 

 

compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
 
 
加入头插件
apply plugin: 'org.greenrobot.greendao'

 

greendao {
    schemaVersion 1
    daoPackage 'com.anye.greendao.gen'
    targetGenDir 'src/main/java'
}

 

schemaVersion--> 指定数据库schema版本号,迁移等操作会用到;
daoPackage --> dao的包名,包名默认是entity所在的包;
targetGenDir --> 生成数据库文件的目录;

2,外层Build中

 

 

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
          }
}

3,greendao中的注解

(一) @Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(二) @Id   主键id是long型@Id(autoincrement = true)是否自动递增,可以直接使用null不去管理id
(三) @NotNull 不为null
(四) @Unique 唯一约束
(五) @ToMany 一对多
(六) @OrderBy 排序
(七) @ToOne 一对一
(八) @Transient 不存储在数据库中
(九) @generated 由greendao产生的构造函数或方法

@Generated(hash = 1780925602)报错的时候去掉后面的(hash = 1780925602)让系统自动生成

 

 

1.准备工作

我们的代码仍然使用前面的文章用到的GreendaoDemo项目 
利用我们前面学到的知识,我们为数据库添加一下三条数据: 
Father表:

姓名 年龄
James 45
Tom 60
Jet 40

Son表:

姓名 年龄 fatherId
小猿 20 fatherDao.insert(father0)
小明 28 fatherDao.insert(father1)
小明子 15 fatherDao.insert(father2)

到此,准备工作完成!

2.eq 和 noteq 和 like 查询

1.首先,第一种条件查询我们使用到的是一个eq方法,我们封装了一个queryEq方法,先看代码:

private void queryEq() {
    Son mingEq = sonDao.queryBuilder().where(SonDao.Properties.Name.eq("小明")).unique();
    Log.d("mingEq", "queryEq() called" + mingEq);
}

然后我们运行,通过在logcat中搜索mingEq标签,我们就可以看到,控制台只打印了小明的数据 
其实这个参数就是指定某一数据进行查找 
它返回的是一个Son型的数据 
通过where关键字判断Name为小明来查找到小明的信息 
eq方法为具体查找

2.我们再来看一下noteq方法,我们封装了一个querynoteq方法,代码如下:

private void queryNotEq() {
    List mingNotEq = sonDao.queryBuilder().where(SonDao.Properties.Age.notEq(15)).list();
    Log.d("mingNotEq", "queryNotEq() called" + mingNotEq);
}

我们运行代码,通过搜索mingNotEq标签,我们可以看到小猿和小明的数据 
我们可以看到与eq不同,notEq方法返回的数据时一个list

3.我们再来看一下like方法,我们封装了一个queryLike方法,看一下代码:

private void queryLike() {
    List mingLike = sonDao.queryBuilder().where(SonDao.Properties.Name.like("小明%")).list();
    Log.d("mingLike", "queryLike() called" + mingLike);
}

好,我们运行代码,通过搜索mingLike标签,我们就可以看到小明和小明子的数据 
为什么呢,其实,like方法就是搜索一个通配符 
所以只要含有小明的数据,都会搜索出来了 
我们知道这是相当于一个模糊搜索,并不是返回一条数据,而是一个列表了

3. >、<、>=、<= 查询

我们看一下使用“>”查找的代码: 
private void queryGt() { 
List mingGt = sonDao.queryBuilder().where(SonDao.Properties.Age.gt(18)).list(); 
Log.d(“mingGt”, “queryGt() called” + mingGt); 

通过logcat我们可以看到我们搜索的是年龄大于18的数据 
这是因为我们调用了gt方法,gt方法就是实现的“>”的条件查询

其实标题中的四种条件对应的就是四个方法 
1. > : gt 
2. < : lt 
3. >= : ge 
4. <= : le

这里我们不一一演示了,可以自己敲代码感受一下!

4. isNull 和 isNotNull 查询

这两个查询就是查询数据库中有无数据的 
使用方法与上文的查询方法类似,大家可以自己体验一下! 
这里不再演示

5. 排序

我们重点来学习一下对数据中的数据升序或降序排列并打印出来

首先我们实现数据的升序排列,我们封装了一个queryAsc的方法: 
private void queryAsc() { 
List data0 = sonDao.queryBuilder().orderAsc(SonDao.Properties.Age).list(); 
Log.d(“data0”,”queryAsc() called”+data0); 
我们运行,搜索data0标签,可以看到数据的打印顺序是小明子、小猿、小明 
我们通过orderAsc方法就轻松实现了数据的升序排列!

降序排列呢,我们可以将orderAsc方法替换为orderDesc就可以实现了!

6. 多线程查询

当我们的数据库非常庞大的时候 
我们知道在主线程中查询数据时非常耗时的 
所以我们这需要把查询放到子线程中 
下面我们封装一个queryThread方法:

private void queryThread() {

    final Query query = sonDao.queryBuilder().build();
    new Thread(){
        @Override
        public void run() {
            List list = query.list();
            Log.d("queryThread", "run() called" + list);
        }
    }.start();
}

我们运行程序,发现程序崩溃了 
其实,greendao框架呢是不允许多线程查询操作这样使用的 
他为我们提供了forCurrentThread方法 
我们可以这样: 
private void queryThread() {

    final Query query = sonDao.queryBuilder().build();
    new Thread(){
        @Override
        public void run() {
            List list = query.forCurrentThread().list();
            Log.d("queryThread", "run() called" + list);
        }
    }.start();
}

其实,这是greendao为提升效率,为我们提供的一种优化方法 
当我们使用子线程查询操作时,这样的方法是更好的 
具体原因可以看一下greendao的源代码,仔细研究一下!

到此,我们greendao条件查询的学习就完成了!

好,关于GreenDAO的学习就基本结束了

 

 

 

你可能感兴趣的:(android)