編輯:關於Android編程
做Android開發,避免不了要和SQLite打交道,如果不使用任何框架,直接使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與解析查詢結果等,那麼是比較麻煩的!目前市面都出現好多比較好用的ORM數據庫框架,例如郭神出的LitePal,OrmLite,GreenDAO等。那麼今天就來介紹一下GreenDAO的有關使用。
一、GreenDAO概述。

簡單的講,GreenDAO是一個將對象映射到 SQLite 數據庫中的輕量且快速的 ORM 解決方案。
GreenDAO是一個可以幫助Android開發者快速將Java對象映射到SQLite數據庫的表單中的ORM解決方案,通過使用一個簡單的面向對象API,開發者可以對Java對象進行存儲、更新、刪除和查詢。
1.GreenDAO官網,http://greendao-orm.com/。
2.項目地址,https://github.com/greenrobot/greenDAO。
GreenDAO設計的主要目標
(1). 一個精簡的庫
(2). 性能最大化
(3).內存開銷最小化
(4).易於使用的 APIs
(5).對 Android 進行高度優化
3.核心類說明

(1).DaoMaster 保存了數據庫對象和管理DAO類的classes,其提供了一些靜態方法創建和刪除表,內部類OpenHelper和DevOpenHelper 實現了SQLiteOpenHelper並創建數據庫的框架。
(2)DaoSession 管理所有可用的DAO對象,可以通過getter方法獲得。DaoSession還提供了一些通用的持久性方法比如插入、加載、更新,刷新和刪除實體。
(3).EntityDao 數據訪問對象,每一個實體類都有對應的greenDAO對象。
(4).Entity 實體類對象。
二、配置GreenDAO框架。
目前GreenDAO已經更新到3.*,新版本的使用方法和GreenDAO2.*有所不同,本文基於的是GreenDAO2.*,需要大家注意!
1.如果你使用的Android Studio,那麼配置使用GreenDAO很簡單,只需要在Gradle文件中加入依賴,
compile "de.greenrobot:greendao:*"
就可以了!Gradle會幫你遠程下載這個GreenDAO框架。
2.如果你使用的還是Eclipse,那麼就需要下載jar,導入到項目即可使用,你可以在http://search.maven.org中搜索以下三個jar下載,
greendao-generator.jar,freemarker.jar,greendao.jar
三、創建Java工程,生成DAO 文件。
如果你使用的還是Eclipse需要創建一個Java工程,該工程主要用來生成生成數據庫表對應的java實體和處理業務的dao層代碼。需要導入包greendao-generator.jar和freemarker.jar。下面,是使用Android Studio實現的。
前提
打開Android Studio,新建一個Project,在module中‘src/main’目錄下,新建一個目錄,名稱為‘java-gen’,


然後需要在該module的build.gradle中,加入如下代碼,
android {
...
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/java-gen']
}
}
...
}
dependencies {
...
compile 'de.greenrobot:greendao:2.1.0'
}
1. 新建一個Java工程。在Project右鍵,“NEW-Module”,然後在頁面中選擇‘java Library’,

2.在該java工程的build.gradle中,需要引入依賴,
compile 'de.greenrobot:greendao-generator:2.1.0'3. 新建一個類 ExampleDaoGenerator,具體代碼如下,
public static void main(String[] args) throws Exception {
//第一個參數是數據庫版本號,第二個參數是包的根目錄的包
int version=1;
String defaultPackage="cn.xinxing.model";
Schema schema = new Schema(version, defaultPackage);
//指定自動生成的dao對象的包名,不指定則都DAO類生成在defaultPackage包中
schema.setDefaultJavaPackageDao("cn.xinxing.dao");
//添加實體
addEntity(schema);
addNote(schema);
try {
//第二個參數是src-gen文件夾路徑
String outDir="E:/as_workspace/test/greendaotest/src/main/java-gen";
new DaoGenerator().generateAll(schema,outDir);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void addEntity(Schema schema) {
//一個實體(類)就關聯到數據庫中的一張表
Entity entity = schema.addEntity("Student");
//指定表名,如不指定,表名則為 Entity(即實體類名)
entity.setTableName("student");
//給實體類中添加屬性(即給表中添加字段)
entity.addIdProperty().autoincrement();//添加Id,自增長
entity.addStringProperty("name").notNull();//添加String類型的name,不能為空
entity.addIntProperty("age");//添加Int類型的age
entity.addDoubleProperty("score");//添加Double的score
}
private static void addNote(Schema schema) {
// 一個實體(類)就關聯到數據庫中的一張表,此處表名為「Note」(既類名)
Entity note = schema.addEntity("Note");
// 指定表名,如不指定,表名則為實體類名
note.setTableName("note");
// greenDAO 會自動根據實體類的屬性值來創建表字段,並賦予默認值
//給實體類中添加屬性(即給表中添加字段)
note.addIdProperty().autoincrement();//添加Id,自增長
note.addStringProperty("text").notNull();//不能為空
note.addStringProperty("comment");
note.addDateProperty("date");
}
說明,
(1).創建模型或者說創建表 需要用到Schema類(數據庫對象的集合),
// 第一個參數是數據庫版本號,第二個參數是根目錄的包路徑 int version=1; String defaultPackage="cn.xinxing.model"; Schema schema = new Schema(version, defaultPackage);(2).指定自動生成的dao對象的包名,不指定則都DAO類生成在defaultPackage包中
schema.setDefaultJavaPackageDao("cn.xinxing.dao");
(3).添加實體(通過實體類創建出表以及字段)
private static void addEntity(Schema schema) {
//一個實體(類)就關聯到數據庫中的一張表
Entity entity = schema.addEntity("Student");
//指定表名,如不指定,表名則為 Entity(即實體類名)
entity.setTableName("student");
//給實體類中添加屬性(即給表中添加字段)
entity.addIdProperty().autoincrement();//添加Id,自增長
entity.addStringProperty("name").notNull();//添加String類型的name,不能為空
entity.addIntProperty("age");//添加Int類型的age
entity.addDoubleProperty("score");//添加Double的score
}
(4). 生成DAO,
String outDir="E:/as_workspace/test/greendaotest/src/main/java-gen";
new DaoGenerator().generateAll(schema,outDir); //第二個參數是src-gen文件夾相對路徑
寫完以上代碼後,運行該java工程,在控制台如果輸入如下信息,說明成功了,如果出錯,請按照錯誤提示處理。

然後我們打開java-gen目錄,便會看到

至此,生成DAO已經完成了,下面就看如何使用這些文件,
四、使用。
為了管理以及使用方便,我們創建一個DbHelper 類,通過它來管理有關數據庫操作。
DbHelper 的具體實現如下,
public class DbHelper {
private static DbHelper instance;
private DaoMaster.DevOpenHelper helper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private StudentDao mStunentDao;
public static synchronized DbHelper getInstance(Context context) {
if (instance == null)
instance = new DbHelper(context);
return instance;
}
private DbHelper(Context context) {
helper = new DaoMaster.DevOpenHelper(context, "xinxing-db", null);
db = helper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
mStunentDao = mDaoSession.getStudentDao();
mStunentDao.getDatabase();
}
/**
* 向student表中插入一條數據
*
* @param student
*/
public void insertStudent(Student student) {
mStunentDao.insert(student);
}
/**
* 向student表中插入多條數據
*
* @param list
*/
public void insertStudent(List list) {
for (Student s : list) {
mStunentDao.insert(s);
}
}
/**
* 獲取所有的student表中數據
*
* @return
*/
public List getAllStudents() {
return mStunentDao.loadAll();
}
public void closeDb() {
if (db.isOpen())
db.close();
}
}
上面是簡單操作數據庫的方法,下面在Activity中編寫測試代碼,
public class MainActivity extends AppCompatActivity {
Button btn;
TextView tv;
Student mStudent;
StringBuffer stringBuffer;
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DbHelper.getInstance(MainActivity.this).deleteAllStudent();
stringBuffer = new StringBuffer();
btn = (Button) findViewById(R.id.addData);
tv = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
i++;
stringBuffer.setLength(0);
mStudent=new Student();
mStudent.setName("job" + i);
mStudent.setAge(i);
mStudent.setScore(100d-i);
DbHelper.getInstance(MainActivity.this).insertStudent(mStudent);
List list = DbHelper.getInstance(MainActivity.this).getAllStudents();
for (Student s : list) {
stringBuffer.append(s.getName() + s.getAge() + s.getScore()+"\n");
}
tv.setText(stringBuffer.toString());
}
});
}
}
下面是運行後點擊多次按鈕的效果截圖,

下面是數據庫中的student表數據截圖,

至此,使用GreenDAO創建數據庫以及表,插入數據,顯示數據都已經成功了!是不是很簡單呢!
下篇文章講解使用GreenDAO來做一些復雜的查詢操作以及更新!
Android:Activity+Fragment及它們之間的數據交換(一)
簡介:為什麼要用Fragment?使用Fragment可以在一個Activity中實現不同的界面。Fragment與Fragment之間的動畫切換,遠比Activity與
Android快樂貪吃蛇游戲實戰項目開發教程-04虛擬方向鍵(三)三角形按鈕效果
一、知識點講解當我們點擊系統自帶的按鈕時,按鈕的外觀會發生變化。上篇博文中我們畫了一個三角形按鈕,但點擊還不能變色,下面我們就來實現點擊變色功能。從知識體系上我們需要了解
Android編程之基於Log演示一個activity生命周期實例詳解
本文實例講述了Android編程之基於Log演示一個activity生命周期。分享給大家供大家參考,具體如下:利用Android的Log 演示一個activity的生命周
Android RatingBar結合屬性動畫,快速實現 QQ群男女比例分布圖效果
RatingBar介紹 RatingBar作為評分組件,它在實現打分功能的時候確實很方便,並結合了手勢觸摸事件;RatingBar 的實質是 ProgressBar ,可