LitePal是Android《第一行代碼》作者郭神的開源ORM架構,一個很好用的ORM。
雖然好用,但是如果不加注意,會遇到很多坑。所謂坑,并不是說架構不好,隻是說有一些細節注意不到可能會犯錯。
這不是bug,但是教程也好,示例demo中也罷,很少有提到,隻能在使用過程中一一總結了。
以下總結自己使用中遇到的問題,逐漸完善。
先介紹下簡單使用:
app目錄下的build.gradle中增加依賴:
在assets檔案夾下建立一個相應的litepal.xml檔案夾::
在Application的onCreate中,增加初始化:LitePal.initialize(this);引入完畢。
問題一:
預設的資料庫存儲位置問題,可在litepal.xml檔案中指定storage value="external"或者 "internal",預設是internal,檔案浏覽器檢視是不可見或無權限的。external則在Android/data/目錄下能找到資料庫檔案。但是,無論設定為哪種,隻要應用解除安裝,資料庫就跟着清除掉了。
如何能夠持久保留資料庫檔案,不受是否解除安裝的影響呢?也簡單,改下storage即可。
如:storage value="mydir" ,就會在根目錄下的mydir目錄下找到資料庫檔案。但前提是這個mydir已經提前建立好吧,若未建立會怎樣,試下就知道。
問題二:
多表關聯問題,關聯的表無法存入資料。
這裡有個隐藏的秘密,很難發現。建立一對一關聯或一對多關聯後,首先你要記得把關聯表的資料save!!并不是你直接把資料set指派之後,關聯表就有資料了。set隻是給兩個表建立關聯的。并且,除了save外,那個set也一樣不能漏,否則你會看到關聯的表裡那個外鍵字段内容為空。
正解如:
問題三:
有多表關聯的實體,查詢時查出來的關聯的表内容為空。
比如定義了一個實體,内部還關聯了其他實體類。查詢時如果不加注意,隻能查到本實體的内容,關聯的實體查到的為空。
舉例如:
如果隻是想當然的 LitePal.find(OrderTransdtlRecord.class,10),這樣查到的dtlList為null,沒有資料。而應該如下寫法:
問題四:
删除一條記錄,關聯的表裡内容本該跟着删除的,但是資料還在,删除不掉的問題。如:
這樣是删不掉OrderTransdtlRecord的關聯表OrderDishTransdtlRecord中的資料的。原因跟上個類似,這裡的查詢沒增加第三個參數,isEager:True to load the associated models, false not.加上第三個參數,查詢成功後,再删除,這樣關聯表才會跟着删除。或者使用這種方式,LitePal.delete(OrderTransdtlRecord.class,18),關聯表會跟着删除。
或者使用這種方式,關聯的表也會随之删除:
問題五:
LitePal中不支援枚舉類型。如果你的model裡使用了枚舉類型,在生成的表結構裡枚舉類型的字段會被忽略。
常用的類型如String和int,long可以放心用,其他類型需做好測試,不能想當然。
LitePal支援的資料類型有8種,分别為:int、short、long、float、double、boolean、String和Date。其他不支援的如枚舉,會被忽略。
并且,如果裡面使用了表關聯,需在litpal.xml中注冊,否則,也會被忽略,而非生成關聯的表結構。
在進行boolean類型操作的時候也需要注意。對于LitePal資料庫,存儲boolean值為true的時候可以直接用LitePal存儲對象的方式存儲,若存儲的對象中boolean為false,需要調用setToDefault(String name)方法存儲,其中參數name為對象中Boolean屬性的名稱,為字元串boolean值其實是以0和1的方式存到資料庫中的,true=1,false=0,是以在查詢的時候需要注意。
問題六:
LitePal資料庫的操作,預設是在主線程中的,使用時需注意自己處理線程和異步問題。
雖然之前版本LitePal提供的有異步操作api,但是作者說了,盡量少用。後續版本可能廢棄不再維護。推薦應用開發者自己處理異步問題,如使用RxJava異步庫。
問題七:
LitePal不能更改資料庫表名和字段名。預設的表名就是定義的實體類的類名,且都為小寫,字段名都是實體類中定義的屬性的小寫。
問題八:
LitePal不支援自定義主鍵,預設的主鍵為id,不管一個實體類對象有沒有設定id字段,資料庫的表中都會建立一個id的主鍵,而這個id的值會在新記錄插入時被自動置為表中的Id,也即是唯一值。如果你裡面定義了個String id,運作會報錯的。
問題九:
更新表結構時要格外注意,以防曆史資料被清空。以下一些更新情況LitePal無法處理并且被更新表格裡的所有資料将被清空:
添加了一個标注為 unique = true 的屬性;
修改某個屬性的标注為 unique = true;
修改某個屬性的标注為 nullable = false;
以上情況會導緻資料丢失,要格外注意。
不斷總結中,歡迎補充......