Android SQLite輕量框架LitePal基本使用
簡介
LitePal是一個開源的安卓庫,允許程式設計師極其簡單的操作SQLite資料庫。甚至不用寫一句SQL語句就能完成大多數SQLite資料庫操作,包括建立去或者更新表,CRUD操作,聚合操作等等。
特點
- 使用物件關係對映模型(ORM)。
- 基本上0配置,僅僅需要一個配置檔案。
- 自動與表保持聯動(建立、修改或者刪除)。
- 多資料庫支援。
- 對SQL語句進行封裝。
- 簡潔的查詢語句。
- 同時支援原生API的使用。
配置
匯入庫
下載jar檔案或者直接在gradle中引入依賴:
dependencies { compile 'org.litepal.android:core:1.5.1'
配置litepal.xml檔案
建立assert資料夾(與res同級),在其中建立litepal.xml檔案,在裡面如下配置:
<?xml version="1.0" encoding="utf-8"?> <litepal> <!-- 定義資料庫的名稱,預設情況下需要新增字尾.db,如果沒有新增litepal內部將會自動新增該字尾 --> <dbname value="demo" /> <!-- 定義資料庫的版本,每次你想升級資料庫的時候在此處進行版本號定義.通常當你修改了下面mapping中的model類後需要升級,版本號加一 -->
配置LitePalApplication
為了避免每次使用都需要傳遞Context變數,可以直接在AndroidManifest.xml檔案中使用LitePalApplication.
<manifest> <application android:name="org.litepal.LitePalApplication" ... > ... </application> </manifest>
如果有自定義的Application,讓它繼承至LitePalApplication即可.然後需要Application的onCreate方法中初始化:
public class MyOwnApplication extends AnotherApplication { @Override public void onCreate() { super.onCreate(); LitePal.initialize(this); } ... }
使用
建立表
定義模型類,假如建立了一個Album類:
public class Album extends DataSupport { @Column(unique = true, defaultValue = "unknown") private String name; private float price; private byte[] cover; private List<Song> songs = new ArrayList<Song>(); // generated getters and setters. ... }
然後在配置檔案litepal.xml檔案中配置:
<list> <mapping class="org.litepal.litepalsample.model.Album" /> </list>
之後在你下次操作資料庫時該表自動建立.你就假設該表已經存在,當你開啟,插入資料等操作時litepal檢測到表不存在將會自動建立.
更新表
直接對模型類進行修改:
public class Album extends DataSupport { @Column(unique = true, defaultValue = "unknown") private String name; @Column(ignore = true) private float price; private byte[] cover; private Date releaseDate; private List<Song> songs = new ArrayList<Song>(); // generated getters and setters. ... }
這裡添加了一個releaseDate變數(欄位),price變數(欄位)註釋為忽略.
然後在litepal.xml檔案中更新版本號:
<!-- 假設之前版本號為1 --> <version value="2" ></version>
表將會在下次對資料庫進行操作時更新,新增一個releaseDate欄位,移除price欄位.
儲存資料
繼承自DataSupport的子類將會有save方法,呼叫即可儲存資料到資料庫:
Album album = new Album(); album.setName("album"); album.setPrice(10.99f); album.setCover(getCoverImageBytes()); album.save();
查詢資料
查詢單條資料根據id:
Album album = DataSupport.find(Album.class, id);
條件查詢:
//注意問號 List<Album> albums = DataSupport.where("name=?", "fantasy").order("price").find(Album.class);
更新資料
查詢到資料取得模型類的物件,呼叫set方法修改後呼叫save儲存即可.
Album albumToUpdate = DataSupport.find(Album.class, 1); albumToUpdate.setPrice(20.99f); // raise the price albumToUpdate.save();
刪除資料
和查詢資料用法類似.
根據id刪除單條資料:
DataSupport.delete(Song.class, id);
刪除所有資料:
DataSupport.deleteAll(Song.class, "duration > ?" , "350");
非同步操作
當操作的資料量過大時可能需要非同步操作避免當前執行緒阻塞,litepal支援所有CRUD操作方法非同步操作.(都有對應的async方法)
例如:
DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() { @Override public <T> void onFinish(List<T> t) { List<Song> allSongs = (List<Song>) t; } });
如果需要的話,呼叫listen方法新增該操作的監聽器.