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博客:
 
使用操作;
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章