郭神博客傳送門
一. 什么是LitePal?
LitePal是郭神寫的開源Android數據庫框架,采用了對象-關系映射(ORM),并對數據庫常用操作進行了封裝,Github地址是https://github.com/LitePalFramework/LitePal。
二. 優點
- 實現了ORM映射,不用自己對Cursor進行封裝。
- 簡化了SQLiteDatabase的CURD操作。
三. 使用方法
1. 先進行各種配置
- 添加依賴
compile 'org.litepal.android:core:1.5.1'//版本號以官方最新為準
- 在assets(Project\app\src\main\assets)文件夾下(若沒有該文件夾,手動添加),添加配置文件litepal.xml(用來配置數據庫名、版本等信息)
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--
用來定義數據庫名,應該以.db結束,但是可以不寫,LitePal會自動添加
-->
<dbname value="demo" />
<!--
定義數據庫版本號,每次升級數據庫配置的時候應該將該值加1,初始版本為1
-->
<version value="1" />
<!--
在mapping子標簽里定義要映射的類
例如:
<list>
<mapping class="com.test.model.Reader" />
<mapping class="com.test.model.Magazine" />
</list>
-->
<list>
</list>
<!--
定義數據庫文件存放的位置,internal代表儲存在內置存儲,external代表儲存在外部存儲。可以不寫,默認是internal。
例如:
<storage value="external" />
-->
<storage value="internal" />
</litepal>
- 配置application
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
如果已經配置過application,則在自己application的onCreate添加LitePal.initialize(this);
2. 配置完成,開始使用
- 新建數據庫
- 新建JavaBean
public class Demo {
/*@Column注解可以為映射的列添加約束,共有四個值
* nullable 是否為空約束
* unique 唯一約束
* ignore 映射的時候忽略的屬性
* defaultValue 默認值設置
* */
@Column(nullable = false,unique = true,ignore = false,defaultValue = "123")
private String name;
@Column(nullable = false ,defaultValue = "18")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 將bean添加到模型映射中
<list>
<mapping class="bean1"/>
<mapping class="bean2"/>
<mapping class="bean3"/>
</list>
- 調用
LitePal.getDatabase()
,Lite Pal就會創建數據庫
- 升級數據庫
- 升級的時候要是要加入新的Bean則添加映射,然后再將litepal.xml里面的版本號加1即可
- 升級數據庫過程數據不會丟失
- 添加數據
- 將bean類繼承自DataSupport
- 實例化bean,設置參數,調用
save()
方法就可以將數據插入數據庫了
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
Song song1 = new Song();
song1.setName("song1");
song1.setDuration(320);
song1.setAlbum(album);
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album);
song2.save();
- 刪除數據
-
delete(bean.class,rowId)
方法(刪除某張表中rowid對應的行)
-
DataSupport.delete(Song.class, id);
-
deleteAll(bean.class,String...conditions)
方法(根據conditions條件刪除表中的數據)
DataSupport.deleteAll(Song.class, "duration > ?" , "350");
- 修改(更新)數據
-
save()
(找到已經存在的對象,然后重新設置屬性,重新save)
-
Album albumToUpdate = DataSupport.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();
-
update(int rowId)
(新建對象,設置要更改的屬性,調用update方法,更新要更新的行)
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.update(id);
-
updateAll(bean.class,String... conditinos)
(更新滿足條件的行)
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.updateAll("name = ?", "album");
- 查詢數據
- 通過
find(bean.class,int rowId)
查找指定行
- 通過
Song song = DataSupport.find(Song.class, id);
- 通過
findAll(bean.class,long... ids)
查找想要查找的行
List<Song> allSongs = DataSupport.findAll(Song.class);//查找所有行
List<Song> allSongs = DataSupport.findAll(Song.class,1,2,3);//查找前三行
- 連綴查詢
連綴查詢
連綴查詢續
- 原生查詢
Cursor cursor = DataSupport.findBySQL(String sql)
四. 更多操作
- 分頁操作:采用連綴查詢,用limit限制每頁展示的條數,用offset設置偏移量來查詢需要的數據
/**
* 分頁查詢
* @param offset 偏移量,用來查詢分頁數據,剛開始offset為0,查詢前20條,然后offset設置為20,就查詢21-40的數據,以此類推
* @return 查詢到的數據List
*/
public static List<User> queryPagingData(int offset){
List<User> userList = DataSupport.select("name","age","gender")
.where()
.limit(20)
.offset(offset)
.find(User.class);
return userList;
}