Android GreenDao数据库升级 原生sqite数据迁移到greendao数据备份

步骤
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的升级思路:

  1. 创建临时表TMP_,复制原来的数据库到临时表中;
  2. 删除之前的原表;
  3. 创建新表;
  4. 将临时表中的数据复制到新表中,最后将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里面没数据呢?
所以这里可以引用Android-Debug-Database在不借助工具的情况下查看数据库。
如何导出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博客:
 
使用操作;
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值