Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫框架——LitePal,修煉三重境界,你到那一層了?

Android數據庫框架——LitePal,修煉三重境界,你到那一層了?

編輯:關於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 List commentList = new ArrayList();
}
// comment 對應一個news
public class Comment {
    ...
    private News news;
    ...
}

對於news和category

public class News {
    ...
    private List categoryList = 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);   // 查詢最後一條數據
List newsList = 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); // 所有數據

連綴查詢
根據指定查詢條件查詢

List newsList = 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參數表示使用激進查詢,關聯的數據也會一起查出來
List commentList = news.getCommentList();

使用懶加載也可以查詢出關聯數據,比如在News類中增加代碼

public class News extends DataSupport {
    ...
    public List getComments() {
        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。

    // 錯誤的寫法
    // List noPowerPhones = 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,最後一個賦值成功後,以前的只能置空。
以上就是關聯表的數據新增操作。
“`

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved