1. 程式人生 > >安卓專案實戰之資料庫框架LitePal的使用詳解

安卓專案實戰之資料庫框架LitePal的使用詳解

LitePal簡介

LitePal是一款開源的Android資料庫框架,它採用了物件關係對映(ORM)的模式,並將我們平時開發最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表和增刪改查的操作,並且LitePal很“輕”,jar包大小不到100k,而且近乎零配置,這一點和Hibernate這類的框架有很大區別。目前LitePal的原始碼已經託管到了GitHub上:http://github.com/LitePalFramework/LitePal

LitePal的使用

1.新增依賴 在app/build.gradle檔案中新增compile依賴如下:

dependencies {
    compile 'org.litepal.android:core:2.0.0'
}

其中2.0.0是我使用時當前最新的版本,你們可以自己去GitHub上找最新的版本。

2.在assets目錄下建立litepal.xml配置檔案 專案資料夾下New->Folder->Assets Folder建立相應的assets資料夾,然後在assets資料夾下建立一個名為litepal.xml的檔案,編輯檔案如下:

<?xml version="0.1" encoding="utf-8"?>
<litepal>
   <dbname value="litepaldemo" />            // 資料庫名稱為litepaldemo,預設以 .db 結尾,如未以此結尾,則自動新增。 
   <version value="1" />                     // 資料庫版本為1,每次資料庫發生變動版本號必須+1
   <list>                                    // 有幾張表就在list之間寫幾個mapping
      // list標籤中的實體類都應該繼承DataSupport這個類,這個千萬別忘記
       <mapping class="com.gpf.com.User"></mapping>
       <mapping class="com.gpf.com.Reader"></mapping>  
       <mapping class="com.gpf.com.Movie"></mapping>
   </list>                           
   <storage value="gpf/database" />  //storage 定義資料庫檔案儲存的地方,可選 internal(內部) 和 external(外部), 預設為 internal 
</litepal>

3.在Application中初始化 在自己的application中加入一行程式碼即可:

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
        super.onCreate();
        // 初始化
        LitePal.initialize(this); 
    }  
 ... 
 }

經過上面3步的配置,LitePal就已經整合成功並可以正常使用了。

4.實體類建立

/**一定要繼承自DataSupport*/ 
public class Movie extens DataSupport{ 
    //運用註解來為欄位新增index標籤 
    
    //name是唯一的,且預設值為unknown 
    @Column(unique = true, defaultValue = "unknown") 
    private String name; 
    
    //忽略即是不在資料庫中建立該屬性對應的欄位 
    @Column(ignore = true) 
    private float price; 
    
    private byte[] cover; 
    private int duration; 
    
    //不為空 
    @Column(nullable = false) 
    private String director; 
    
    private String type; 
    
    //記得新增所有欄位的getter和setter方法 
}

注意:

  • 不管實體類中有沒有id這個屬性,都會預設建立一個為整型的id欄位,作為自增的主鍵
  • 如果實體類中有一個欄位名為id,那麼型別只能為int或者long
  • id欄位的值始終為當前記錄的行號(下標從1開始),即使我們在實體類中定義了int或者long型別的id欄位,在新增資料時人為的設定id的值為100,等其他值,查詢資料庫發現該id欄位的值設定是無效的,她始終等於該條記錄所在的行id,即第幾條記錄。
  • 所有的column註解總共有四個,defaultValue的預設值為空字元,所以這個註解只能用以是String型別的欄位,即字元型才有預設值
  • litepal支援的實體類欄位對映型別為 int,long,double,float,byte[],boolean,String,Date;不支援String[]陣列型

資料庫增刪改查操作

1.儲存操作

Movie movie1=new Movie(); 
  movie1.setId(1002); 
  movie1.setName("東成西就"); 
  movie1.setDirector("劉鎮偉"); 
  movie1.setDuration(100); 
  movie1.setType("喜劇"); 
//這一句程式碼就是將一條記錄儲存進資料庫中
movie1.save();

save()方法是有返回值的,返回true代表新增成功,返回flase代表新增失敗。 save()是新增一條資料,批量新增是 DataSupport.saveAll(persons);

2.刪除記錄

//刪除資料庫中movie表的所有記錄 
DataSupport.deleteAll(Movie.class); 

//刪除資料庫movie表中id為1的記錄 
DataSupport.deleteAll(Movie.class,1); 

//刪除資料庫movie表中duration大於3500的記錄 
DataSupport.deleteAll(Movie.class, "duration > ?" , "3500"); 

3.修改記錄 方法一:

//第一步,查詢id為1的記錄 
Movie movie = DataSupport.find(Movie.class, 1); 
//第二步,改變某個欄位的值 
movie.setPrice(4020f); 
//第三步,儲存資料 
movie.save(); 

方法二:

Movie movie=new Movie(); 
movie.setName("2Diots"); 
movie.setDirector("某人");
 //直接更新id為1的記錄 
 movie.update(1);

方法三:

Movie movie=new Movie(); 
movie.setDirector("someone"); 
//更新所有name為2Diots的記錄,將director欄位設為someone 
movie.updateAll("name = ?", "2Diots");

Movie movie=new Movie(); 
movie.setName("someone"); 
movie.setDirector("someone"); 
//將更新所有name為2Diots,director為gpf的記錄name和director均改為someone
movie.updateAll("name=? and director=?", "2Diots","gpf");

4.查詢記錄

//查詢movie表的所有記錄,返回值是一個泛型為Movie的List集合
List<Movie> allMovies = DataSupport.findAll(Movie.class); 

//查詢movie表id為1的記錄 
Movie movie = DataSupport.find(Movie.class,1); 

//查詢name為2Diots的記錄,並且以時長作排序 
List<Movie> movies = DataSupport.where("name = ?", "2Diots").order("duration").find(Movie.class); 

//查詢所有年齡小於25歲的人
List<Person> person = DataSupport.where("age < ?", 25).find(Person.class); 

使用LitePal來完成升級表的操作:

使用LitePal來建立表之間的關聯關係:

在資料庫中表與表之間的關聯關係一共有三種類型:一對一,一對多,多對多,下面分情況討論:

一對一:

例如新聞表News和簡介表Introducation,一條新聞只能對應一條簡介,同時一條簡介也只能屬於一條新聞。 一對一關係的體現: 在程式語言中:只需要在News類中持有一個Introduction類的引用,然後在Introduction類中也持有一個News類的引用,這樣它們之間自然就是一對一的關係了: 在這裡插入圖片描述 就是這麼簡單,在News類中可以得到一個對應的Introduction的例項,那麼它們之間就是一對一關係了。 在資料庫表中的體現:使用外來鍵,並且外來鍵加在任意哪一張表上都可以。

一對多:

例如新聞表News和評論表Comment,一條新聞可以有多條評論,但是一條評論只能屬於一條新聞。 一對多關係的體現: 在程式語言中:java中有List,Set等集合類來建立物件之間的一對多關係,只需要在一的一方即News類中建立一個集合型別並且泛型是Comment的成員變數即可。 在這裡插入圖片描述 在這裡插入圖片描述

在資料庫表中的提現:也是使用外來鍵,但是外來鍵只能加在多方的表中。

多對多:

例如新聞表News和種類表Category,一條新聞可能屬於不同的種類,同樣的一種種類下也可以有多條新聞。 多對多關係的體現: 在程式語言中:只需要在News類中使用集合類宣告擁有多個Category,然後在Category類中也使用集合類宣告擁有多個News就可以了。 在這裡插入圖片描述 在這裡插入圖片描述 在資料庫表中的體現:多對多關係不能使用外來鍵來表示,必須藉助於中間表,中間表主要用來存放News表和category表之間的關聯關係。

針對以上表和表之間的關聯關係,如果建表的時候使用SQL語句那麼肯定會特別複雜,稍有不慎就有可能會出錯,因此使用LitePal來自動建立表關聯又是一個非常不錯的選擇,我們不需要關心什麼外來鍵,什麼中間表等實現的細節,只需要在實體類中宣告好他們之間的引用關係即可。