編輯:關於Android編程
GreenDAO是一個開放的安卓代碼庫,來提供一個容易使用的SQLite數據庫接口,幫助開發者更加高效的處理數據——將開發者從處理低級的數據庫需求中解放出來,從而節省了開發時間。SQLite是一個很不錯的嵌入式關系型數據庫。不過,編寫SPL和解析查詢結果是相當的繁瑣和耗時的任務。greenDAO通過使用ORM的方式,將開發人員解放出來。你可以使用一個簡單的面向對象的API來完成數據的存儲、更新、刪除和查詢操作(CRUD)。
我個人感覺,從簡單的使用角度來講,GreenDAO要比OrmLite、SugarORM等稍微復雜一些,尤其是2.x版本,前期配置代碼分離的代碼生成模塊要稍微麻煩。但是,考慮到它的性能和非常強大的特點,我覺得這點兒麻煩不算什麼。而且,3.x版本使用了注解,會使得代碼生成十分方便,不用分離項目。截止到目前,3.0處於beta版本,後期會持續更新。
但是,一般來講,Android端不會創建十分復雜的數據庫,所以如果是簡單的表結構和少量的數據,也可以采用其他的方法。同樣是搬磚,但是也要學會靈活運用!
開發工具 Android Studio 2.1.2
數據庫查看的工具 SQLite Expert Professional 3.1.9.2085
這個教程會幫助你完成一個簡單的greenDAO例程。它可以在https://github.com/greenrobot/greenDAO獲得,這個項目包含兩個子項目:DaoExample和DaoExampleGenerator,可以clone下來進行學習。如果你將DaoExample從git倉庫中復制出來,可以作為一個Android項目單獨運行。如你所見,這是一個簡單的記筆記的APP。你可以通過寫入一些文本來添加新的筆記,並且通過點擊刪除按鈕刪除筆記。
在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();
}
}
運行效果
greenDAO是一個安卓的ORM工具,它提供了一個類面向對象的接口,將Object映射到關系數據庫中。ORM工具如greenDAO做很多重復性的工作為你和為你提供一個簡單的接口數據。
為了在你的Android項目使用greenDAO(通常是一個Eclipse項目),您需要創建一個項目,generator項目。它的任務就是為你的安卓項目生成特定的代碼。
一般情況下,為了安全,數據庫創建在/data/data/包名/databases目錄下即可,但是demo中為了隨時將數據庫從手機中取出,查看數據庫的數據,所以暫時將數據庫建立在sd卡中。
詳細代碼,見 DBUtil.java
在代碼中為了使得使用更加清晰和方便,我簡單的封裝了一下,將DAOs都封裝到了DBUtil.java裡面了。
關於數據庫的初始化,官方建議在Application層完成,這樣的話,就不用多次創建Session了,但是,如果應用中對數據庫的操作較少,只要確保在第一次執行數據庫操作之前完成初始化即可。
基於Android 6.0的源碼剖析, 分析Binder IPC通信的權限控制方法clearCallingIdentity和restoreCallingId
球體繪制類 package test.com.opengles6_1;import java.nio.ByteBuffer;import java.nio.By
Android安全加密專題文章索引 Android安全加密:對稱加密 Android安全加密:非對稱加密 Android安全加密:消息摘要Message D
上一篇博客中我們已經繪制出了一個直角三角形,雖然我們相對於坐標,我們設置的直角三角形的兩腰是相等的,但是實際上展示出來的卻並不是這樣,雖然通過計算,我們可以把三角形的兩腰