編輯:關於Android編程
LitePal是一款開源的Android數據庫框架,采用了ORM對象關系映射的模式,將常用的數據庫功能進行了封裝。是大名鼎鼎郭神的傑作。
下面我主要分三個階段來講解:基本用法,進階用法,注意事項,適合各個層次的人用來進一步更深入地了解和應用LitePal,下面開始正題…
———–基本用法————
引入jar包
下載最新版本
https://github.com/LitePalFramework/LitePal
也可以在github上下載LitePal的源碼,使用Library的方式導入Eclipse中
或在AndroidStudio中添加依賴
dependencies { compile 'org.litepal.android:core:1.3.2' }
配置litepal.xml
在assets目錄下建立litepal.xml文件
dbname用於設定數據庫的名字,version用於設定數據庫版本號,list用於設定所有的映射模型
配置LitePalApplication
在AndroidManifest.xml中配置一個LitePalApplication
...
如果使用了自定義的Application繼承LitePalApplication即可
建表
根據對象關系映射模式的概念,每一張表應該對應一個模型,比如對應的News模型
public class News{ private int id; // 可以不寫,LitePalace會自定生成 private String title; private String content; private Date publishDate; private int commentCount; // getter、setter }
映射的數據類型一共有8種:int、short、long、float、double、boolean、String和Date
使用LitePal只有聲明private的字段才會被映射到數據表中,如果不想映射的話,修飾符設置為public、protected、default就可以了
建立後再配置到映射表中,編輯asset目錄下的litepal.xml的文件,
在標簽下加入News模型類的聲明
獲取SQLiteDatabase的實例
SQLiteDatabase db = Connector.getDatabase();
升級表
增加新的表或者改變表結構,只需要需要對應model的屬性,在litepal.xml中進行配置,並對version進行加1處理。
———–中級用法———–
建立表關聯
一對一關系
比如相應News每一條新聞都有一段introduction簡介
可以在introduction中設置一個news_id的外鍵列,存放具體新聞的id
多對一關系
比如一個News對應多個Comment評論
在Comment中設置new_id列,存放具體New的ID,多個comment就對應了同一個New
多對多
比如News可以有很多Category種類,Category對應很多News
可以新建一個中間表來存放news和category的關系
category_news表設置news_id和category_id兩列,分別是news表的外鍵和category表的外鍵
使用LitePal建立關聯表
新建Introduction和Category兩個類
public class Introduction { private int id; private String guidie; private String digest; // getter、setter } public class Category { private int id; private int name; // getter、setter }
在News中添加Introduction的引用
public class News { ... private Introduction introdution; ... }
因為Comment和News是多對一的關系
// news對應多個comment public class News { ... private ListcommentList = new ArrayList (); } // comment 對應一個news public class Comment { ... private News news; ... }
對於news和category
public class News { ... private ListcategoryList = new ArrayList (); ... } public class Category { ... private List newsList = new ArrayList (); ... }
存儲
要進行CRUD操作所有實體類都需要繼承自DataSupport類
之後實體類就可以進行CRUD操作了
News news = new News(); news.setTitle("標題"); news.setContent("內容"); news.setPubllishDate(new Date); news.save(); // 返回布爾值,是否存儲成功
也可以使用saveThrows()方法,拋異常來捕捉存儲失敗的異常
其中LitePal已經默默地幫我們設置了id
Comment和News是多對一的關系
Comment comment1 = new Comment(); comment1.setContent("好評!"); comment1.setPublishDate(new Date()); comment1.save(); Comment comment2 = new Comment(); comment2.setContent("贊一個"); comment2.setPublishDate(new Date()); comment2.save(); News news = new News(); news.getCommentList().add(comment1); news.getCommentList().add(comment2); news.setTitle("第二條新聞標題"); news.setContent("第二條新聞內容"); news.setPublishDate(new Date()); news.setCommentCount(news.getCommentList().size()); news.save();
這樣多對一的關系就被建立,而且Comment中的news_id已經被默默賦值
如果有一個List newsList,可以使用DataSupport.saveAll(newsList)來存儲集合數據
修改數據
比如把news表中id為2的記錄的標題修改
ContentValues = new ContentValues(); values.put('title',"title修改"); DataSupport.update(News.class,values,2);
修改多條數據
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values, "title = ?", "今日iPhone6發布");
使用約束條件可以限定特定的數據,?為占位符,用後面的String數據代入
比如:
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "今日iPhone6發布", "0");
如果全部修改可以不使用約束
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values);
使用ContentValues對象並不是那麼友好,也可以直接使用實體類
News updateNews = new News(); updateNews.setTtitle("新標題"); updateNews.update(2); //... News updateNews = new News(); updateNews.setTitle("今日iPhone6發布"); updateNews.updateAll("title = ? and commentcount > ?", "今日iPhone6發布", "0");
如果要修改某列數據為默認值,使用setToDefault()方法
刪除
DataSupport.delete(News.class,2); // 刪除news表中id為2的記錄,news_id為2的記錄為外鍵的數據也會刪除,返回值為被輸出的記錄數 DataSupport.deleteAll(News.class,"title = ? and commentcount = ? ","title","0"); // 批量刪除 DataSupport.deleteAll(News.class); // 刪除所有
查詢
News news = DataSupport.find(News.class,1); // 查詢id為1的記錄 News first = DataSupport.findFirst(News.class); // 查詢第一條數據 News last = DataSupport.findLast(News.class); // 查詢最後一條數據 ListnewsList = DataSupport.findAll(News.class,1,3,5,7); // 查詢id為1,3,5,7的數據 long[]ids = new long[]{1,3,5,7}; List newsList2 = DataSupport.findAll(News.class,ids); List newsList3 = DataSupport.findAll(News.class); // 所有數據
連綴查詢
根據指定查詢條件查詢
ListnewsList = DataSupport.where("commentcount > ?","0").find(News.class); List newsList = DataSupport.select("title", "content") .where("commentcount > ?", "0").find(News.class); // 只要title和content兩列數據 List newsList = DataSupport.select("title", "content") .where("commentcount > ?", "0") .order("publishdate desc").find(News.class); // asc正序排序、desc倒序排序 List newsList = DataSupport.select("title", "content") .where("commentcount > ?", "0") .order("publishdate desc").limit(10).find(News.class); // 只查詢10條數據 List newsList = DataSupport.select("title", "content") .where("commentcount > ?", "0") .order("publishdate desc").limit(10).offset(10) .find(News.class); // 查詢11-20
激進查詢
上述的查詢無法查詢關聯表的數據,LitePal默認的模式就是懶查詢,如果要一次性將關聯表中的數據也一起查詢出來,LitePal也支持激進查詢的方式。
News news = DataSupport.find(News.class,1,true); // true參數表示使用激進查詢,關聯的數據也會一起查出來 ListcommentList = news.getCommentList();
使用懶加載也可以查詢出關聯數據,比如在News類中增加代碼
public class News extends DataSupport { ... public ListgetComments() { return DataSupport.where(news_id=?),String.valueOf(id)).find(Comment.class); } }
原生查詢
LitaPal也可以使用原生的查詢(SQL語句)
Cursor cursor = DataSupport.findBySQL("select * from news where commentcount>?","0");
聚合函數
LitePal中提供了count()、sum()、average()、max()、min()這五種聚合函數
count()
count()主要用於統計行數
int result = DataSupport.count(News.class); int result = DataSupport.where("commnetcount = ?","0").count(News.class);
sum()
sum()用於對結果進行求和
// 第一個參數表示表,第二個參數是列名,第三個參數用於指定結果的類型 int result = DataSupport.sum(News.class,"commentcount",int.class); // 表示所有的評論數
average()
average()用於統計平均數
double result = DataSupport.average(News.class,"commentcount");
max()
求出列中最大的數值
int result = DataSupport.max(News.class,"commentcount",int.class);
min()
求出列中最小的數值
int result = DataSupport.min(News.class,"commentcount",int.class);
———注意事項———-
1. 更改某個數據為默認值
當需要將某個數據改為為默認值時,例如一個phone對象,其power屬性為boolean類型,默認值是false,當你在某個方法中需要更改該屬性為false,不能使用phone.setPower(false),而是調用setToDefault()方法。用法也很簡單,在setToDefault()方法中傳入要修改的字段名就可以了(類中的字段名)。
默認值就是java中的基本數據類型的默認值,例如int類型的就是0,boolean類型的就是false
// 錯誤的寫法 phone.setPower(false); phone.setToDefault("power");
特別需要注意的是,當使update(id)更新對象時,當對象的某個屬性將被更改成默認值時,要小心處理。
2. 查詢boolean類型的字段時的問題
boolean類型的字段在設置為真時就是是賦值true,以及使用setToDefault()方法,賦值都是true或false,但是實際存儲時,存在數據庫的為1或0,所以查詢時查詢參數應該為1和0,而不是true和false。還是以查詢Phone表為例子,查找所有沒電的手機,即phone.isPower()==false。
// 錯誤的寫法 // ListnoPowerPhones = DataSupport.where("power = ?", “false”).find(Phone.class); // 正確的寫法 List noPowerPhones = DataSupport.where("power = ?", “0”).find(Phone.class);
3. 關聯表新增關聯項問題
LitePal配置表關聯很便捷,但在關聯表之間添加數據更改數據需要注意。還是以Phone為例子:
Phone.class .... private List apps = new ArrayList<>; .... App.class ... private Phone phone; ...
以上代碼表示Phone和App是一對多的關系,在app的數據庫表中會出現自動出現一個phone_id字段,表示該app對應的手機。
當需要給一個手機新增一個app時,應該這樣操作
// 查找id為2的手機 Phone phone = DataSupport.find(Phone.class, 2); // 新增一個短信App App message = new App(); ... message.setSize(...); ... message.save; // 這是關鍵 // 將message應用與id為2的手機關聯起來 // 數據庫中app表中的message的phone_id字段將變成2 message.setPhone(phone);
以上也可以用設置在phone添加中設置 phone.GetApp().Add(message);同樣也可以給App中phone_id賦值。
對“一對一”的賦值中,A一對B一,需要在A中添加 private B b;A的某個id只能賦值給B中一個A_id,最後一個賦值成功後,以前的只能置空。
以上就是關聯表的數據新增操作。
“`
效果圖源碼KqwOpenCVFeaturesDemo角點是兩條邊緣的交點或者在局部鄰域中有多個顯著邊緣方向的點。Harris角點檢測是一種在角點檢測中最常見的技術。Har
使用ViewStub延遲加載1.ViewStub延遲加載 ViewStub是一個不可見的,大小為0的View,最佳用途就是實現View的延遲加載,在需要的時候再加載Vie
設置兩張圖片重疊的模式。在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那麼它將完全遮擋住下面的Paint;如果它是部分
前言本篇博客給大家分享一個WebView的使用案例,實現Android調用JavaScript代碼來控制白天/夜間模式。關於WebView如何使用,官網有很好的說明,Bu