步骤
1.配置包
2.配置自动生成代码的插件
3.写实体类
4.make project生成3个类
API:
5.//根据主键删除
mUserDao.deleteByKey(l);
基本api
1.怎么创建多个表?
2.数据库表明修改
3.修改字段,默认都话会使大写
@nameInDb 在数据库中的名字,如不写则为实体中类名
4.默认值
5.主键
@Id
6.@Property
允许您定义属性映射到的非默认列名。如果不存在,GreenDAO将以SQL-ish方式使用字段名称(大写,下划线而不是camel情况,例如 name将成为 NAME)。注意:您当前只能使用内联常量来指定列名。
允许您定义属性映射到的非默认列名。如果不存在,GreenDAO将以SQL-ish方式使用字段名称(大写,下划线而不是camel情况,例如 name将成为 NAME)。注意:您当前只能使用内联常量来指定列名。
GreenDao的升级思路:
- 创建临时表TMP_,复制原来的数据库到临时表中;
- 删除之前的原表;
- 创建新表;
- 将临时表中的数据复制到新表中,最后将TMP_表删除掉;
数据库升级
Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
要解决的问题
1.从原生数据到greendao,
解决查询的问题(ok)
出问题了,可以查询,不能插入?
1).把数据哭的表对照一下(ok)
2).运行demo,没有数据库的demo包
3).把yuedong的数据库拷贝到demo中去
4).运行demo,然后查询下数据
2.
.在以前的数据库上面添加一个表有问题
不过是修改还是新增加表都要修改版本号
否则会报错:没有这个表
3.查看数据库,导出数据库(ok)
SQLite数据库.db | .db-wal | .db-shw到底是个啥,为什么我导出.db里面没数据呢?
如何导出greendao的数库?????
4.Greendao数据更新
更新语句:
SQLiteProgram: UPDATE "setting" SET "user_id"=?,"islogin"=?,"user_rank"=?,"hx_phone"=?,"user_name"=?,"user_password"=?,"user_phone"=? WHERE "setting"."user_id"=?
日志打印:
2020-02-16 09:26:42.296 22565-22565/top.daxianwill.greendaodemo D/greenDAO: Built SQL for query: SELECT T."key",T."value" FROM "expandSetting" T WHERE T."key"=?
2020-02-16 09:26:42.296 22565-22565/top.daxianwill.greendaodemo D/greenDAO: Values for query: [name]
问题:
1.主键是可以是string,但是是不变的,更新的时候不能更新主键
----------------------------------------
今天上午更新数据的时候使用GreenDao出现Cannot update entity without key - was it inserted before?
抛出该异常的原因:在调用update()时传入的主键为 null。
该问题的应用环境:表中满足某条件的记录不重复,有则改之,无则’加冕’。
解决问题的方法:查询表中满足条件的记录,取其id赋值给新记录。
根据这三点一一往下排查,最终发现传递过来的数据ID==主键为Null,于是我自己设置了一个ID,就可以了,但是疑惑的是ID我设置的是自增长 为什么还会为null呢?
————————————————
protected void updateInsideSynchronized(T entity, DatabaseStatement stmt, boolean lock) {
// To do? Check if it's worth not to bind PKs here (performance).
bindValues(stmt, entity);
int index = config.allColumns.length + 1;
K key = getKey(entity);
if (key instanceof Long) {
stmt.bindLong(index, (Long) key);
} else if (key == null) {
throw new DaoException("Cannot update entity without key - was it inserted before?");
} else {
stmt.bindString(index, key.toString());
}
stmt.execute();
attachEntity(key, entity, lock);
}
protected void updateInsideSynchronized(T entity, SQLiteStatement stmt, boolean lock) {
// To do? Check if it's worth not to bind PKs here (performance).
bindValues(stmt, entity);
int index = config.allColumns.length + 1;
K key = getKey(entity);
if (key instanceof Long) {
stmt.bindLong(index, (Long) key);
} else if (key == null) {
throw new DaoException("Cannot update entity without key - was it inserted before?");
} else {
stmt.bindString(index, key.toString());
}
stmt.execute();
attachEntity(key, entity, lock);
}
5.像偏好设置一样,可以设置多个值,怎么操作?
6.
如果主键不能变的化,想要修改怎么办?(没有解决)====数据库都应用
7.greendao再添加一个固定id,作为主键,
看下是否可以和以前的数据库兼容,是否报错
以前的数据库是没有主键的,现在必须要主键,到底怎么区分主键????
update,更新必须要有主键吗??????
greendao需要主键,
8.主键的问题
一个数据库和多个表
每一个实体bean都应该有一个主键
如果没有设置主键,那么实体bean不能更新,更新时会提示
does not have a single-column primary key
not have a single-column primary key
9.string可以作为主键吗?
greendao可以,然后更新时候要由主键,把她当主键。
10.查询注意的问题:拼接和原生,一个有缓存一个可能没有缓存
QueryBuilder的使用
编写SQL可能很困难并且容易出现错误,这些错误仅在运行时才会被注意到。该QueryBuilder的类可以让你建立你的实体,而不SQL自定义查询,并有助于在编译时已检测错误。
Greendao原理
1.重要都2个类,源代码分析解决问题
DaoMaster::DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除
2.缓存机制
参考教程:
demo博客:
使用操作;