Android資料庫存取物件--CupBoard
阿新 • • 發佈:2019-02-18
有一段時間沒來寫點什麼了,這次來給大家介紹一個能在資料庫中存取實體物件的庫:cupboard。
在Android開發中,使用資料庫存取資料時,我們最先而且必定要使用的就是 SQLite 了,相信現在還有很多開發者使用資料庫存取時
使用的是最基礎的一些語句,如《android sqlitedatabase 應用》一文中所介紹的一樣。當然,這樣寫並沒有什麼不妥。現在隨著學習的
深入,本人已經不再使用這種方式來進行資料庫的操作,而是改用GreenDao這個開源庫。在Android開發上來說,它可能是最快的ORM,
並且效能高、佔用記憶體小。它將資料物件對映到資料庫表中,然後你可以使用它提供的一個簡單面向物件API對它進行增刪改查。具體有關
GreenDao的使用不是本文內容,暫不介紹。下面繼續本文的重點:CupBoard
CupBoard,它的主要目標就是在SQLite資料庫中儲存Objects。接下來為您詳細介紹它是如何使用盡可能少的SQL語句來進行儲存物件
在Android開發中,使用資料庫存取資料時,我們最先而且必定要使用的就是 SQLite 了,相信現在還有很多開發者使用資料庫存取時
使用的是最基礎的一些語句,如《android sqlitedatabase 應用》一文中所介紹的一樣。當然,這樣寫並沒有什麼不妥。現在隨著學習的
深入,本人已經不再使用這種方式來進行資料庫的操作,而是改用GreenDao這個開源庫。在Android開發上來說,它可能是最快的ORM,
並且效能高、佔用記憶體小。它將資料物件對映到資料庫表中,然後你可以使用它提供的一個簡單面向物件API對它進行增刪改查。具體有關
GreenDao的使用不是本文內容,暫不介紹。下面繼續本文的重點:CupBoard
CupBoard,它的主要目標就是在SQLite資料庫中儲存Objects。接下來為您詳細介紹它是如何使用盡可能少的SQL語句來進行儲存物件
的。不管你之前是使用SQLiteOpenHelper還是第三方庫來進行資料庫操作,本文都非常適合你。
public class Book {
public Long _id;
public String title;
public Author author;
public Date publishDate;
}
接下來,我們將Book這個實體儲存到資料庫中。(變數名對應資料庫中的欄位名)
使用CupBoard來操作資料庫,要用withDatabase()這個方法,並且CupBoard要求須提前將實體注入到SQLiteOpenHelper,我們使用static initializer block 在這裡也許是最好的方法。下面看例子:
首先建立資料庫:
需要注意的是, 從上面程式碼看到,我們只添加了一個static初始化塊和public class CupboardSQLiteOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myapp.db"; private static final int DATABASE_VERSION = 1; static { // register our models cupboard().register(Book.class); cupboard().register(Author.class); } public CupboardSQLiteOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // this will ensure that all tables are created cupboard().withDatabase(db).createTables(); // add indexes and other database tweaks } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // this will upgrade tables, adding columns and new tables. // Note that existing columns will not be converted cupboard().withDatabase(db).upgradeTables(); // do migration work } }
cupboard().withDatabase(db).createTables();
cupboard().withDatabase(db).upgradeTables();
而沒有任何的繼承(extends)和重寫(override)。如何你使用的不是SQLiteOpenHelper,同樣你也要新增一個static初始化塊和update、upgrade
儲存Objects
儲存資料時使用withDatabase(db).put()方法。
Book book = ... long id = cupboard().withDatabase(db).put(book);
讀取Objects
通過id獲得一條資料:讀取id為12的資料物件,如果沒有返回null。
Book book = cupboard().withDatabase(db).get(Book.class, 12L);
我們還可以使用query()來遍歷資料庫
// get the first book in the result
Book book=cupboard().withDatabase(db).query(Book.class).get();
// Get the cursor for this query
Cursor books=cupboard().withDatabase(db).query(Book.class).getCursor();
try{
// Iterate books
QueryResultIterable<Book>itr=cupboard().withDatabase(db).query(Book.class).iterate();
for(Book book:itr){
// do something with book
}
}finally{
// close the cursor
itr.close();
}
// Get the first matching book with title Android
Book book=cupboard().withDatabase(db).query(Book.class).withSelection("title = ?","Android").get();
更改Objects
要是更改整個實體物件,我們可以用put()方法,若是更改一個實體的部分或者是一次更改多個實體,這時使用update().
ContentValues values = new ContentValues(1);
values.put("title", "Android")
// update all books where the title is 'android'
cupboard().withDatabase(db).update(Book.class, values, "title = ?", "android");
刪除Objects
刪除和讀get()、寫put()一樣簡單
// by id
cupboard().withDatabase(db).delete(Book.class, 12L);
// by passing in the entity
cupboard().withDatabase(db).delete(book);
// or by selection
cupboard().withDatabase(db).delete(Book.class, "title = ?", "android");
提示與技巧
1、某些情況下,如果你需要呼叫SQLiteDatabase,可以將任何註冊過的實體轉換為ContentValues物件
ContentValues values = cupboard().withEntity(Book.class).toContentValues(book);
// you can also reuse ContentValues
values = cupboard().withEntity(Book.class).toContentValues(book, values);
2、讀一個數據庫進行多個操作public void doDatabaseWork(SQLiteDatabase database, Book book) {
DatabaseCompartment dbc = cupboard().withDatabase(database);
dbc.put(book);
dbc.update(Book.class, "title = ?", "android");
}
3、下載Jar or 使用Maven
<dependency>
<groupId>nl.qbusict</groupId>
<artifactId>cupboard</artifactId>
<version>1.0.6</version>
</dependency>
Gradle:
compile 'nl.qbusict:cupboard:1.0.6'
更多內容:https://bitbucket.org/Jabin/cupboard or blog.csdn.net/zjbpku