1. 程式人生 > >ORMLite操作資料庫

ORMLite操作資料庫

 開發進階 AndroidChina  6個月前 (09-28)  1321瀏覽 0評論

OrmLite是一個數據庫操作輔助的開源框架,主要面向Java語言。在Android面向資料庫開發中,是一個比較流行的開源框架,方便操作而且功能強大,今天來學習一下,最近的專案中也有所涉及,寫個部落格來記一下吧,感謝大神團隊貢獻如此實用的開源框架,這裡是OrmLite的官方網址:http://ormlite.com/

準備工作–建立資料庫及資料表

ORMlite通過Java註解的方式來建立起與資料庫的對映關係,在這裡我們以一個例項來進行說明,如我們現在想要建立一個簡單的資料庫test.db並建立一張表person

來記錄一個人的名字,年齡,住址等等。

建立Bean類

首先,建立我們的BeanPerson,並通過註解的方式與資料庫聯絡起來

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

(generatedId=true)

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

id) {

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也有兩個重要方法,分別是onCreateonUpgrade,負責資料庫建立以及升級時的操作

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的查詢條件,

最後通過QueryBuilderquery方法獲得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同樣為我們提供了一系列的方法,同時也提供了複雜刪除,複雜更改的DeleteBuilderUpdateBuilder,其用法與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檔案以及官方文件說明:點選下載