Android 快速開發系列之數據庫篇

DemLrv 8年前發布 | 42K 次閱讀 Android Android開發 移動開發 DataBase

前言

在現在不懂就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(簡書)
 

 本文由用戶 DemLrv 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!