Android快速開發--使用ORMLite操作資料庫,androidormlite
OrmLite是一個資料庫操作輔助的開源架構,主要面向Java語言。在Android面向資料庫開發中,是一個比較流行的開源架構,方便操作而且功能強大,今天來學習一下,最近的項目中也有所涉及,寫個部落格來記一下吧,感謝大神團隊貢獻如此實用的開源架構,這裡是OrmLite的官方網址:http://ormlite.com/
準備工作–建立資料庫及資料表
ORMlite通過Java註解的方式來建立起與資料庫的映射關係,在這裡我們以一個執行個體來進行說明,如我們現在想要建立一個簡單的資料庫test.db並建立一張表person來記錄一個人的名字,年齡,住址等等。
建立Bean類
首先,建立我們的Bean類Person,並通過註解的方式與資料庫聯絡起來
@DatabaseTable(tableName = "person")public class Person { @DatabaseField(generatedId=true) private int id; @DatabaseField(columnName="name") private String name; @DatabaseField(columnName="age") private int age; @DatabaseField(columnName="address") private String address; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } /** * @return the address */ public String getAddress() { return address; } /** * @param address the address to set */ public void setAddress(String address) { this.address = address; }}
在這裡我們建立了Bean類,並與資料庫建立了聯絡,有兩件事是我們需要做的
1.需要在@DatabaseTable註解中填入表名
2.在@DatabaseField(columnName=”“)填入欄位名,設定欄位的屬性等等
欄位屬性說明
ORMLite為我們提供了全面的欄位屬性的支援,下面我們來具體看一下吧:
- cloumnName:指定欄位名,不指定則變數名作為欄位名
- canBeNull:是否可以為null
- dataType:指定欄位的類型
- foreign 指定這個欄位的對象是一個外鍵,外索引值是這個對象的id
- foreignAutoCreate 外鍵不存在時是否自動添加到外間表中
- foreignAutoRefresh 外索引值,自動重新整理
- foreignColumnName外鍵欄位指定的外鍵表中的哪個欄位
- generatedId:指定欄位為自增長的id,不能id,generatedIdSequence通用
- id:指定欄位為id
- index:索引
- persisted:指定是否持久化此變數,預設true
- throwIfNull,如果空值拋出異常
- useGetSet:指定ormlite訪問變數使用set,get方法預設使用的是反射機制直接存取變數
- unique:欄位值唯一
- uniqueIndex 唯一索引
- uniqueCombo整列的值唯一
建立資料庫
與Android中的資料庫建立相似,使用OrmLite建立資料庫需要我們建立一個SqlOpenHelper繼承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有兩個重要方法,分別是onCreate和onUpgrade,負責資料庫建立以及升級時的操作
public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper { private Dao<Person, Integer> mPersonDao; public MySqlOpenHelper(Context context) { super(context, "test", null, 1); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) { // TODO Auto-generated method stub try { //建立資料表 TableUtils.createTableIfNotExists(arg1, Person.class); } catch (java.sql.SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2, int arg3) { // TODO Auto-generated method stub } public Dao<Person, Integer> getPersonDao() throws java.sql.SQLException { if (mPersonDao == null) { mPersonDao = getDao(Person.class); } return mPersonDao; }}
Dao是一個很重要的類, 這些Dao對象用於以後的資料庫操作,其包含兩個泛型,第一個泛型表DAO操作的類,第二個是標記資料表的ID。
資料庫操作
建立了我們自己的資料庫之後就可以來,對資料庫操作了,接下來我們看看如何進行資料庫的增刪查改
插入操作
這些方法使用起來都比較簡單,我們只需將自己的Bean傳入到下列方法中即可
- create:插入一條資料
- createIfNotExists:如果不存在則插入
- createOrUpdate:如果存在則更新
查詢操作
OrmLite為我提供了一系列的查詢操作,方法很多,而且很多都是只看方法名就可以知道的,這裡就不逐一介紹了,在這裡介紹一下如何使用QueryBuilder進行複雜尋找。
- 首先調用personDao.queryBuilder();獲得該Dao下的QueryBuilder對象,
- 接下來設定QueryBuilder的查詢條件,
- 最後通過QueryBuilder的query方法獲得List對象,
下面介紹幾個常用的builder下的查詢,
1.多欄位條件查詢:
QueryBuilder builder = dao.queryBuilder(); builder.where().eq("欄位名1","條件1").and.eq(""欄位名2","條件2"); builder.query();
2.查詢並按順序輸出
QueryBuilder<Person, Integer> builder = dao.queryBuilder();builder.orderBy("欄位名", true);builder.query();
orderBy的方法第一參數表示按那個欄位進行排序,第二個參數表示是否為升序。
3.分頁查詢
QueryBuilder<Person, Integer> builder = dao.queryBuilder();builder.offset(10);//表示查詢的起始位置builder.limit(10);//表示總共擷取的對象數量builder.query();
刪除和更改操作
與查詢操作類似,ORMLite同樣為我們提供了一系列的方法,同時也提供了複雜刪除,複雜更改的DeleteBuilder和UpdateBuilder,其用法與QueryBuilder相似,就不詳細介紹了。
將資料庫放置在SD卡
Android建立資料庫預設的儲存路徑是在/data/data/packagename/database 目錄之下,一方面如果資料庫龐大將佔用系統儲存空間,另一方面如果沒有獲得系統ROOT許可權,將不能直觀的看到該資料庫。所以在最後介紹一下如何將資料庫建立在指定的SD卡目錄之下。
這個在ORMLite中並沒有提供,自己來動手寫一寫吧。閱讀一下Android的源碼可以很容易發現,Android資料庫存放的目錄是由ContextWrapper類下的public File getDatabasePath(String name)方法決定的,那麼我們只需建立自己的Context覆蓋該方法即可。
public class DatabaseContext extends ContextWrapper { private static final String ROOT_SDCARD = Environment .getExternalStorageDirectory().getAbsolutePath(); private String dbDir; public DatabaseContext(Context base, String path) { super(base); dbDir = path; } @Override public File getDatabasePath(String name) { // 判斷是否存在sd卡 boolean sdExist = android.os.Environment.MEDIA_MOUNTED .equals(android.os.Environment.getExternalStorageState()); if (!sdExist) {// 如果不存在, Log.e("Database error", "SD卡不存在"); return null; } // 判斷目錄是否存在,不存在則建立該目錄 File dirFile = new File(dbDir); if (!dirFile.exists()) dirFile.mkdirs(); // 標記資料庫檔案是否建立成功 boolean isFileCreateSuccess = false; String dbPath = dbDir + "/" + name;// 資料庫路徑 File dbFile = new File(dbPath); // 如果資料庫檔案不存在則建立該檔案 if (!dbFile.exists()) { try { isFileCreateSuccess = dbFile.createNewFile();// 建立檔案 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else isFileCreateSuccess = true; // 返回資料庫檔案對象 if (isFileCreateSuccess) return dbFile; else return null; } @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase( getDatabasePath(name), null); return result; } /** * Android 4.0會調用此方法擷取資料庫。 * */ @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase( getDatabasePath(name), null); return result; }}
之後我們在建立SQLOpenHelper時,只需傳入我們自己的DatabaseContext 即可,如
SdCardDBHelper dbHelper = new SdCardDBHelper(new DatabaseContext( MainActivity.this, path), "person.db");
ORMLite相關檔案下載
附上ORMLite相關jar檔案以及官方文檔說明:點擊下載