Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> GreenDAO—Android ORM框架(一)

GreenDAO—Android ORM框架(一)

編輯:關於Android編程

簡介

GreenDAO是一個開放的安卓代碼庫,來提供一個容易使用的SQLite數據庫接口,幫助開發者更加高效的處理數據——將開發者從處理低級的數據庫需求中解放出來,從而節省了開發時間。SQLite是一個很不錯的嵌入式關系型數據庫。不過,編寫SPL和解析查詢結果是相當的繁瑣和耗時的任務。greenDAO通過使用ORM的方式,將開發人員解放出來。你可以使用一個簡單的面向對象的API來完成數據的存儲、更新、刪除和查詢操作(CRUD)。
\

安卓組內分享流程(Android ORM框架認知)

\

前言

我個人感覺,從簡單的使用角度來講,GreenDAO要比OrmLite、SugarORM等稍微復雜一些,尤其是2.x版本,前期配置代碼分離的代碼生成模塊要稍微麻煩。但是,考慮到它的性能和非常強大的特點,我覺得這點兒麻煩不算什麼。而且,3.x版本使用了注解,會使得代碼生成十分方便,不用分離項目。截止到目前,3.0處於beta版本,後期會持續更新。
但是,一般來講,Android端不會創建十分復雜的數據庫,所以如果是簡單的表結構和少量的數據,也可以采用其他的方法。同樣是搬磚,但是也要學會靈活運用!

特點

對象關系映射(ORM)
greenDAO本質是提供一個面向對象的接口,完成對象與保存在關系數據庫中的數據的映射。就像數據模型中定義的一樣,greenDAO會創建數據的Java實體類(JavaBean),以及DAO類。這些會節省你很多無聊的代碼,僅僅是數據的來回移動。另外,greenDAO會提供一些高級的ORM特點,例如會話緩存,預先加載,以及活躍的實體類(?)。 最優的性能
在已知的ORM框架中,是最快的。關於性能greenDAO不做任何妥協。數據庫用於存儲大量的數據,因此速度很重要。使用greenDAO,每秒可以插入、更新和加載幾千個實體類。
\ APIs簡單<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqO6x7+087XEQVBJsPy6rMHLudjPtbrNway906O7IDxzdHJvbmc+xNq05s/7usTJ2Twvc3Ryb25nPqO7IDxzdHJvbmc+v+LOxLz+0KE8L3N0cm9uZz4oJmx0OzEwMEtCKaO7IDxzdHJvbmc+1qez1sr9vt2/4rzTw9w8L3N0cm9uZz6jutans9bKudPDU1FMQ2lwaGVyKFNRTGl0Zcr9vt2/4rzTw9y/8rzcKbbUyv2+3b/ivNPD3KO7KNPRx+nM4dDRo6y4w7zTw9y8vMr1u+HKubXDYXBrseS1w7rctPMpIDxzdHJvbmc+x7+087XEv6q3os3FzOU8L3N0cm9uZz6juw0KPGgyIGlkPQ=="開發工具和開發環境">開發工具和開發環境

開發工具 Android Studio 2.1.2
數據庫查看的工具 SQLite Expert Professional 3.1.9.2085

 How to get started

這個教程會幫助你完成一個簡單的greenDAO例程。它可以在https://github.com/greenrobot/greenDAO獲得,這個項目包含兩個子項目:DaoExample和DaoExampleGenerator,可以clone下來進行學習。如果你將DaoExample從git倉庫中復制出來,可以作為一個Android項目單獨運行。如你所見,這是一個簡單的記筆記的APP。你可以通過寫入一些文本來添加新的筆記,並且通過點擊刪除按鈕刪除筆記。

Add greenDAO to your project

在src/main目錄下創建一個目錄(右鍵New->Directory),比如名稱為java-dao-gen,該目錄主要是用於存放生成的Bean、DAOs類。
\

Android工程添加greenDAO依賴,並且給android節點添加程序來源:
compile ‘org.greenrobot:greendao:2.2.0’
sourceSets {
main {
java.srcDirs = [‘src/main/java’, ‘src/main/java-dao-gen’]
}
}
如下圖:

創建GreenDAO代碼生成模塊(Module),這是一個純Java工程

選擇JAVA Library

包名和類名隨意定義,比如:
包名:greendaogenerator
類名:DAOGenerator

代碼生成模塊添加依賴
compile ‘org.greenrobot:greendao-generator:2.2.0’

編寫代碼生成類DAOGenerator
注意,Java工程只有這一個類,這個類就是用來生成代碼模板的,在這個類中可以創建數據庫,以及通過對象、關系等創建表結構,詳細代碼可以參考代碼中的注釋。

在DAOGenerator的main方法中點擊鼠標右鍵,運行該方法,然後就會在我們的android工程中生成相應的Bean和DAOs類:

在Android工程中進行數據庫的CRUD操作
(詳細見代碼)
/* 插入數據 /
private void submit() {

String name = et_name.getText().toString().trim();
String stuId = et_id.getText().toString().trim();
String phone = et_phone.getText().toString().trim();

Student student = new Student(null, name, stuId, phone, new Date());

/*
    數據庫裡的一條記錄對應著一個Java對象,所以插入操作,僅僅需要插入一個對象即可。
 */
DBUtil.getStudentDao().insert(student);

Log.d("【submit】", "Inserted new student, ID: " + student.getId() + " , Name:"+name);

}

/* 查詢所有數據 /
private void queryAll() {

/*
    獲取屬性名稱,這一步主要是為了查詢的時候作為查詢條件使用
    String number = StudentDao.Properties.Number.columnName;
    String orderBy = number + " COLLATE LOCALIZED ASC"; // 按照學號的升序排列

    該方法是調用數據庫SQLiteDatabase的query()方法來進行查詢的,比較繁瑣,但是說明也是執行SQL語句的
    cursor = DBUtil.getDB().query(tablename, DBUtil.getStudentDao().getAllColumns(), null, null, null, null, orderBy);

    String[] from = { name , number };
    int[] to = { android.R.id.text1, android.R.id.text2 };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, to);
    lv.setAdapter(adapter);
 */

// 以下是通過GreenDAO的方式查詢數據庫,所有的操作都是面向對象的方式
Query query = DBUtil.getStudentDao().queryBuilder()
                        .where(StudentDao.Properties.Number.isNotNull())
                        .orderAsc(StudentDao.Properties.Number)     // 按照學號的升序排列
                        .build();

list = query.list();

if ((list != null) && (list.size()>0)) {
    if (adapter == null) {
        adapter = new MyLVAdapter();
        lv.setAdapter(adapter);
    } else {
        adapter.notifyDataSetChanged();
    }
} else {
    Toast.makeText(MainActivity.this,"數據庫裡沒有數據了!",Toast.LENGTH_SHORT).show();
}

}

/* 查詢一條數據 /
private void queryOne() {

String stuId = et_stuid.getText().toString().trim();
Log.i("【查詢的學生的學號】",stuId);

StudentDao studentDao = DBUtil.getStudentDao();

// 一個可以被反復執行的查詢的實體類
Query query = studentDao.queryBuilder()
                        .where(StudentDao.Properties.Number.eq(stuId))  // 學號屬性等於被查詢的數值
                        .build();

QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;

// 查詢結果以list返回
List list = query.list();

String result = "";
if ((list != null) && (list.size()>0)) {
    Student student = list.get(0);
    result = student.getId()+","+student.getName()+","+student.getNumber()+","+student.getPhone()+","+new SimpleDateFormat().format(student.getDate());
} else {
    Toast.makeText(MainActivity.this,"查無此人!",Toast.LENGTH_SHORT).show();
}
tv_check_one.setText(result);

}

/* 刪除一條數據 /
private void deleteOne() {

String stuId = et_stuid.getText().toString().trim();
Log.i("【刪除的學生的學號】",stuId);

StudentDao studentDao = DBUtil.getStudentDao();

// 一個可以被反復執行的查詢的實體類
Query query = studentDao.queryBuilder()
        .where(StudentDao.Properties.Number.eq(stuId))  // 學號屬性等於被查詢的數值
        .build();

List list = query.list();

for (int i = 0; i < list.size(); i++) {
    studentDao.deleteByKey(list.get(i).getId());    //通過id刪除掉記錄
}

}

/* 刪除數據庫所有數據 /
private void deleteAll() {

Log.i("【刪除數據庫所有數據】"," ======== 清空了~~~ ========= ");
DBUtil.getStudentDao().deleteAll();
list.clear();
if (adapter != null) {
    adapter.notifyDataSetChanged();
}

}

運行效果
\

預生成代碼和創建表

所有的預生成代碼都是由分離的Java模塊生成的,在3.x中將會有較大的改善; 所有的對數據庫的操作都是在Android項目中的,詳細看demo中的MainActivity.java.

介紹

\
greenDAO是一個安卓的ORM工具,它提供了一個類面向對象的接口,將Object映射到關系數據庫中。ORM工具如greenDAO做很多重復性的工作為你和為你提供一個簡單的接口數據。

代碼生成工程

\
為了在你的Android項目使用greenDAO(通常是一個Eclipse項目),您需要創建一個項目,generator項目。它的任務就是為你的安卓項目生成特定的代碼。

核心類

\

問題

1.關於數據庫創建的位置

一般情況下,為了安全,數據庫創建在/data/data/包名/databases目錄下即可,但是demo中為了隨時將數據庫從手機中取出,查看數據庫的數據,所以暫時將數據庫建立在sd卡中。
詳細代碼,見 DBUtil.java

2.簡單封裝,便於使用

在代碼中為了使得使用更加清晰和方便,我簡單的封裝了一下,將DAOs都封裝到了DBUtil.java裡面了。

3.數據庫的初始化

關於數據庫的初始化,官方建議在Application層完成,這樣的話,就不用多次創建Session了,但是,如果應用中對數據庫的操作較少,只要確保在第一次執行數據庫操作之前完成初始化即可。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved