ORMLite操作資料庫
開發進階 AndroidChina 6個月前 (09-28) 1321瀏覽 0評論
OrmLite是一個數據庫操作輔助的開源框架,主要面向Java語言。在Android面向資料庫開發中,是一個比較流行的開源框架,方便操作而且功能強大,今天來學習一下,最近的專案中也有所涉及,寫個部落格來記一下吧,感謝大神團隊貢獻如此實用的開源框架,這裡是OrmLite的官方網址:http://ormlite.com/
準備工作–建立資料庫及資料表
ORMlite通過Java註解的方式來建立起與資料庫的對映關係,在這裡我們以一個例項來進行說明,如我們現在想要建立一個簡單的資料庫test.db並建立一張表person
建立Bean類
首先,建立我們的Bean類Person,並通過註解的方式與資料庫聯絡起來
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
@DatabaseTable(tableName ="person") publicclassPerson { @DatabaseField privateintid; @DatabaseField(columnName="name") privateString name; @DatabaseField(columnName="age") privateintage; @DatabaseField(columnName="address") privateString address; /** * @return the id */ publicintgetId() { returnid; } /** * @param id the id to set */ publicvoidsetId(int this.id = id; } /** * @return the name */ publicString getName() { returnname; } /** * @param name the name to set */ publicvoidsetName(String name) { this.name = name; } /** * @return the age */ publicintgetAge() { returnage; } /** * @param age the age to set */ publicvoidsetAge(intage) { this.age = age; } /** * @return the address */ publicString getAddress() { returnaddress; } /** * @param address the address to set */ publicvoidsetAddress(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,負責資料庫建立以及升級時的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
publicclassMySqlOpenHelperextendsOrmLiteSqliteOpenHelper { privateDao<Person, Integer> mPersonDao; publicMySqlOpenHelper(Context context) { super(context,"test",null,1); // TODO Auto-generated constructor stub } @Override publicvoidonCreate(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 publicvoidonUpgrade(SQLiteDatabase arg0, ConnectionSource arg1,intarg2, intarg3) { // TODO Auto-generated method stub } publicDao<Person, Integer> getPersonDao()throwsjava.sql.SQLException { if(mPersonDao ==null) { mPersonDao = getDao(Person.class); } returnmPersonDao; } } |
Dao是一個很重要的類, 這些Dao物件用於以後的資料庫操作,其包含兩個泛型,第一個泛型表DAO操作的類,第二個是標記資料表的ID。
資料庫操作
建立了我們自己的資料庫之後就可以來,對資料庫操作了,接下來我們看看如何進行資料庫的增刪查改
插入操作
這些方法使用起來都比較簡單,我們只需將自己的Bean傳入到下列方法中即可
create:插入一條資料
createIfNotExists:如果不存在則插入
createOrUpdate:如果存在則更新
查詢操作
OrmLite為我提供了一系列的查詢操作,方法很多,而且很多都是隻看方法名就可以知道的,這裡就不逐一介紹了,在這裡介紹一下如何使用QueryBuilder進行復雜查詢。
首先呼叫personDao.queryBuilder();獲得該Dao下的QueryBuilder物件,
接下來設定QueryBuilder的查詢條件,
最後通過QueryBuilder的query方法獲得List物件,
下面介紹幾個常用的builder下的查詢,
1.多欄位條件查詢:
1 2 3 |
QueryBuilder builder = dao.queryBuilder(); builder.where().eq("欄位名1","條件1").and.eq(""欄位名2","條件2"); builder.query(); |
2.查詢並按順序輸出
1 2 3 |
QueryBuilder<Person, Integer> builder = dao.queryBuilder(); builder.orderBy("欄位名",true); builder.query(); |
orderBy的方法第一引數表示按那個欄位進行排序,第二個引數表示是否為升序。
3.分頁查詢
1 2 3 4 |
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覆蓋該方法即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
publicclassDatabaseContextextendsContextWrapper { privatestaticfinalString ROOT_SDCARD = Environment .getExternalStorageDirectory().getAbsolutePath(); privateString dbDir; publicDatabaseContext(Context base, String path) { super(base); dbDir = path; } @Override publicFile getDatabasePath(String name) { // 判斷是否存在sd卡 booleansdExist = android.os.Environment.MEDIA_MOUNTED .equals(android.os.Environment.getExternalStorageState()); if(!sdExist) {// 如果不存在, Log.e("Database error","SD卡不存在"); returnnull; } // 判斷目錄是否存在,不存在則建立該目錄 File dirFile =newFile(dbDir); if(!dirFile.exists()) dirFile.mkdirs(); // 標記資料庫檔案是否建立成功 booleanisFileCreateSuccess =false; String dbPath = dbDir +"/"+ name;// 資料庫路徑 File dbFile =newFile(dbPath); // 如果資料庫檔案不存在則建立該檔案 if(!dbFile.exists()) { try{ isFileCreateSuccess = dbFile.createNewFile();// 建立檔案 }catch(IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else isFileCreateSuccess =true; // 返回資料庫檔案物件 if(isFileCreateSuccess) returndbFile; else returnnull; } @Override publicSQLiteDatabase openOrCreateDatabase(String name,intmode, SQLiteDatabase.CursorFactory factory) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase( getDatabasePath(name),null); returnresult; } /** * Android 4.0會呼叫此方法獲取資料庫。 * */ @Override publicSQLiteDatabase openOrCreateDatabase(String name,intmode, CursorFactory factory, DatabaseErrorHandler errorHandler) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase( getDatabasePath(name),null); returnresult; } } |
之後我們在建立SQLOpenHelper時,只需傳入我們自己的DatabaseContext 即可,如
1 2 |
SdCardDBHelper dbHelper =newSdCardDBHelper(newDatabaseContext( MainActivity.this, path),"person.db"); |
ORMLite相關檔案下載
附上ORMLite相關jar檔案以及官方文件說明:點選下載