思路;创建临时表-->删除原表-->创建新表-->复制临时表数据到新表并删除临时表;这样数据库表的更新就完成了
@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
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 --> 生成数据库文件的目录;
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
(一) @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)让系统自动生成
我们的代码仍然使用前面的文章用到的GreendaoDemo项目
利用我们前面学到的知识,我们为数据库添加一下三条数据:
Father表:
姓名 | 年龄 |
---|---|
James | 45 |
Tom | 60 |
Jet | 40 |
Son表:
姓名 | 年龄 | fatherId |
---|---|---|
小猿 | 20 | fatherDao.insert(father0) |
小明 | 28 | fatherDao.insert(father1) |
小明子 | 15 | fatherDao.insert(father2) |
到此,准备工作完成!
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方法就是搜索一个通配符
所以只要含有小明的数据,都会搜索出来了
我们知道这是相当于一个模糊搜索,并不是返回一条数据,而是一个列表了
我们看一下使用“>”查找的代码:
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
这里我们不一一演示了,可以自己敲代码感受一下!
这两个查询就是查询数据库中有无数据的
使用方法与上文的查询方法类似,大家可以自己体验一下!
这里不再演示
我们重点来学习一下对数据中的数据升序或降序排列并打印出来
首先我们实现数据的升序排列,我们封装了一个queryAsc的方法:
private void queryAsc() {
List data0 = sonDao.queryBuilder().orderAsc(SonDao.Properties.Age).list();
Log.d(“data0”,”queryAsc() called”+data0);
我们运行,搜索data0标签,可以看到数据的打印顺序是小明子、小猿、小明
我们通过orderAsc方法就轻松实现了数据的升序排列!
降序排列呢,我们可以将orderAsc方法替换为orderDesc就可以实现了!
当我们的数据库非常庞大的时候
我们知道在主线程中查询数据时非常耗时的
所以我们这需要把查询放到子线程中
下面我们封装一个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的源代码,仔细研究一下!