Android GreenDao 在組件化項目中的一個問題 - 2018年7月5日21:15:14


  

  組件化項目使用GreenDao時注意的事項:

1.要在組件化中的基礎庫(domain層)創建實體類;

2.如果sycn之后不能生產Dao文件,使用 Android Studio 的Gradle插件重新build項目,如圖:

build之后就會生成 GreenDao的相關文件了。

3.GreenDao還有一個巨坑的地方,就是你的Bean里的主鍵不要命名為 “id” ,比如醬紫:

@Id
private Long id;
private String name;

然后根據 id 查詢:

出現異常:

 android.database.sqlite.SQLiteException: 
  no such column: id (code 1): , while compiling: SELECT T."_id",T."NAME" FROM "USER" T where id between ? and ? at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)

從錯誤日志可以看出 GreenDao內部把 id 轉成了 _id !!!所以說我們在建實體的時候要避免命名為 id,而是換用其他的 名稱。

當然,在接口已經出好不便修改的情況下,有兩種方案:

  一是我們在做 查詢的切記用 _id 去查,或是用GreenDao建表時生成的大寫 ID 去查詢;

  二是用 Dao 中的 Properties.Id 去做查詢

 public static class Properties {
      public final static Property Id = new Property(0, String.class, "id", true, "ID"); public final static Property TaskId = new Property(1, String.class, "taskId", false, "TASK_ID");
      public final static Property TaskNum = new Property(2, String.class, "taskNum", false, "TASK_NUM");
      public final static Property Zcfdd = new Property(3, String.class, "zcfdd", false, "ZCFDD");
...
}

查詢操作:

QueryBuilder<User> builder = userDao.queryBuilder();
List<User> userList3 = builder.where(UserDao.Properties.Id.gt(1005)).build().list();

附上 Demo :

https://github.com/javakam/IShiQing/tree/412f22176af2d66fecba26145fbefed4a69efcc1/app/src/main/java/com/ishiqing/modules/greendao

 

4.GreenDao查詢數據一個為空,一個不為空的問題。

2018年7月12日 - 周三 今天活脫脫被自己坑了一把。。。。

對應的結果實體類:

問題出現在每次用 UpAssetResultDao 查詢的時候都查不全,一個有result集合,另一個卻為空數組。。

問題代碼:

resultBeanDao.insertOrReplaceInTx(mTableList);// 1 ResultBean 插入數據集合
UpAssetResult upResult
= new UpAssetResult(); ... upResult.setTaskId(pk); upResult.setResult(mTableList); //2 TODO 直接用 List<UpAssetResult> list = upAssetResultDao.loadAll(); 數據不全的問題 // List<UpAssetResult> dataList = new ArrayList<>(); // dataList.add(upResult); upAssetResultDao.insertOrReplaceInTx(upResult);

L.e("resultBeanDao size :" + resultBeanDao.count());//3 插入成功

錯就錯在紅色字體處,UpAssetResult 實體是通過外建關聯 ResultBean 的id進行數據綁定的,

紅色部分在ResultBean外面又封裝了一層 List 雖然數據也能成功插入到ResultBean的數據庫表中,但是沒有關聯上 UpAssetResult

實體。導致后面操作UpAssetResultDao 進行查詢時出現數據異常的問題!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM