Android 快速開發系列之數據庫篇
前言
在現在不懂就google的時代開發本身已經不是什么難事了,能夠開速寫出優雅,靈活,易擴展,高性能的代碼是我們不斷學習和需要努力的目標。隨著Android發展許多新的技術和框架需要我們去學習和深入。下面引用一張圖片來表達我想要實現的Android應用架構圖。
MVP架構圖引用
對于MVP架構的優點大家可以自行搜索,本文不在這里討論MVP和傳統MVC模式的優劣。
- Model:數據層 ,數據來源通常是文件,數據庫,服務器
1 . 數據庫分別使用GreenDao框架和LiteOrm來實現。
2 . 服務器接口調用采用 Retrofit:Square提供的開源產品,為Android平臺的應用提供一個類型安全的REST客戶端,其他的網絡框架Volley,Okhttp等大家可以對比下 - View:UI顯示層 ,通常是由activity,fragment,自定義的viewGroup等組成
- Presenter:中間層 ,負責View和Model的各種邏輯處理包括數據庫操作,網絡數據請求等等
- RxJava 和傳統編程思維不太一樣,基于觀察者模式對數據流的操作非常方便,Retrofit支持Rxjava的結合使用,可以在獲取網絡數據或者數據庫等數據之后利用Rxjava對數據流進行各種操作包括不僅限于數據流的合并,過濾,重新排序,以及后續的數據庫存儲等一系列鏈式處理后更新到View層
- EventBus 事件總線,可以避免回調地獄,如果項目中到處都是接口回調,例如拿到數據后各種通過接口回調告知View更新界面,這對于后期維護是一件很可怕的事情,常見的事件總線有otto,eventbus,Rxbus等框架
正題: greenDao的使用
過去使用原生的sqliteOpenHelper雖然靈活但是需要寫sql語句感覺還是有些繁瑣,于是嘗試使用orm框架來改進,對比了下android上常用的orm框架,都說greenDao的性能,內存等方面在android平臺都進行過優化,是比較被推薦使用的。但是相比LiteOrm這類基于注解的框架學習起來要麻煩一些。并不是簡單的導入個 compile 'xxx:1.0.0'就可以使用的。下面就一步一步講解怎么使用。小弟有說的不正確的地方,大兄弟請見諒。 。
1.在app主項目的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao:2.2.0'
2.在project工程中新建一個model選擇java Library 類型,model命名為dao-example-generator,名字隨意,此model的build.gradle的dependencies中添加 compile 'org.greenrobot:greendao-generator:2.2.0'
3.dao-example-generator中新建一個Class,copy以下代碼到此類中。
public class Daogenerator {
public static void main(String[] args) throws Exception {
Schema schema = new Schema(2, "com.ssp.greendao.dao");//1是數據庫版本號,com.ssp.greendao.dao是自動生成的java類存放的包名,包括核心的DaoMaster,DaoSession等
addNote(schema);
addCustomerOrder(schema);
addStudentCourse(schema);
new DaoGenerator().generateAll(schema, "./app/src/main/java");//DaoMaster,DaoSession等自動生成java類存放在app Model的src/main/java文件夾下
}
/**
* 添加一張單表
*
* @param schema
*/
private static void addNote(Schema schema) {
Entity note = schema.addEntity("Note");//創建一張Note表
note.addIdProperty().primaryKey().autoincrement();//設置主鍵自增長
// note.addIdProperty();這樣默認就是id是主鍵并且自增長了,如果要自己設置一個鍵作為主鍵可以按上面一行代碼這樣寫
note.addStringProperty("text").notNull();//增加String類型的text列并且不能是空的,如果插入內容是空的會報異常
note.addStringProperty("comment");
note.addDateProperty("date");
}
/**
* 添加兩張表顧客表和訂單表,一對多關系
*
* @param schema
*/
private static void addCustomerOrder(Schema schema) {
Entity customer = schema.addEntity("Customer");
customer.addIdProperty();//設置默認的id主鍵
customer.addStringProperty("name").notNull();
Entity order = schema.addEntity("Order");
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword ,設置表名
order.addIdProperty();
Property orderDate = order.addDateProperty("date").getProperty();
Property customerId = order.addLongProperty("customerId").notNull().getProperty();
// 外鍵添加,外鍵customerId
order.addToOne(customer, customerId);
ToMany customerToOrders = customer.addToMany(order, customerId);//1對多關系,一個Customer顧客可以有多個Order訂單,一個Order訂單只屬于一個Customer顧客
customerToOrders.setName("orders");//設置Api的名稱 getOrders()
customerToOrders.orderAsc(orderDate);//設置查詢結果按時間進行升序排序
}
/**
* 添加三張表學生表,課程表還有一張中間表,多對多關系
*
* @param schema
*/
private static void addStudentCourse(Schema schema) {
Entity student = schema.addEntity("Student");
student.addIdProperty();
student.addStringProperty("name").notNull();
student.addStringProperty("sex").notNull();
Entity course = schema.addEntity("Course");
course.addIdProperty();
course.addStringProperty("courseName").notNull();
Entity studentCourse = schema.addEntity("studentCourse");//中間表用于關聯學生表和課程表
Property studentId = studentCourse.addLongProperty("studentId").getProperty();
Property courseId = studentCourse.addLongProperty("courseId").getProperty();
studentCourse.addToOne(student, studentId);
studentCourse.addToOne(course, courseId);
student.addToMany(studentCourse, studentId);
course.addToMany(studentCourse, courseId);
}
}</code></pre>
代碼不在解釋了,注釋寫的很清楚了。。。特殊其實就是這個類它可以幫助生成后面CRUD需要使用到的各種Dao
4 .運行上面這個類稍等片刻會發現在app模塊中多出了一個包

自動生成的java文件
并且該包下面有很多java文件,這就是上面第三步自動生成的,各種Dao
5 .上面已經把環境弄好了,開始使用,greenDao建議我們把daoMaster,daoSession等放在Application中這樣可以避免反復創建session增加開銷
public class MyApplication extends Application {
private DaoMaster daoMaster;
private DaoSession daoSession;
public DaoMaster getDaoMaster() {
if (daoMaster == null) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);//notes-db是創建的數據庫db名稱
SQLiteDatabase db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
}
return daoMaster;
}
public DaoSession getDaoSession() {
if (daoSession == null) {
daoSession = getDaoMaster().newSession();
}
return daoSession;
}
}</code></pre>
簡單的插入一條數據,其他的也類似比較簡單就不啰嗦了,如果項目中的CRUD比較復雜可以封裝到一個dbService中
Note note = new Note(null, noteText, comment, new Date());
NoteDao noteDao = mApplication.getDaoSession().getNoteDao();//獲取dao
noteDao.insert(note);//向note表插入一條數據
文/西瓜太郎123(簡書)