Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android上的事件流操作數據庫

Android上的事件流操作數據庫

編輯:關於Android編程

最近在浏覽某篇有關事件流的文章時,裡面提到了數據的流處理,興趣來了,就想看看能否在Android端實現一個。         根據文章的介紹,將每次數據的變更事件,像是插入,刪除或者更新等,記為一個不可變的事件,讓數據在事件中流淌,而不是對數據庫進行破壞性的寫入,也就是說,直接讀取數據的聚合結果就能獲取最好的性能。         事件流可以完成下面的工作:   1.獲取所有的原始事件,可能需要進行轉換,然後將它們加載到一個大型的數據倉庫中供分析人員使用;   2.更新全文搜索索引,使用戶可以搜索最新的數據; 3.更新緩存,使系統可以從快速緩存中讀取數據,並保證緩存中的數據是最新的; 4.通過對事件流進行處理創建一個新的事件流,然後將後者作為另一個系統的輸入。      可能帶來的好處如下: 1.松耦合:數據讀寫使用不同的數據庫模式,讀取的數據經由寫入的數據轉換而來,應用程序不同部分間的耦合度降低了; 2.讀寫性能:規范化(寫入快)和非規范化(讀取快)的爭論源於數據讀寫使用同一個模式的假設,如果數據讀寫使用不同的數據庫模式,讀寫速度都會得到提升; 3.擴展性:因為事件流是一種簡單的抽象,而且允許開發人員將應用程序分解成流的生產者和消費者,所以容易跨機器並行和擴展; 4.靈活性:原始事件簡單明確,模式遷移不會造成多大影響,而向用戶展示數據要復雜得多,但如果有一個轉換過程可以實現從原始事件到緩存內容的轉換,那麼當需要新的用戶界面時,只需要使用新的邏輯構建新的緩存; 5.錯誤場景:原始事件是不變的事實,如果系統出現問題,那麼開發人員總是可以用相同的順序將事件重放。         如果是這樣的設計, 編寫查詢或者規則來匹配滿足特定模式的事件,還要在流上進行全文搜索,在流上事先注冊一個查詢,當有事件匹配查詢時發送通知。 由此衍生出幾個概念: 1.響應式:主要是將事件流提供給用戶界面使用; 2.變更數據捕獲:按照我們熟悉的方式使用數據庫,但要將任何插入,更新和刪除操作抽取到一個數據變更事件流中。       初步的實現已經出來了,大概的實現如下: 1.創建數據庫和表       在assets文件夾下創建database.xml文件,裡面配置數據庫的名字,版本號和數據庫的表:  
   <?xml version="1.0" encoding="utf-8"?>
      <database>
          <!-- 數據庫名稱 -->
          <dbname value="zwb.db"></dbname>

          <!-- 數據庫版本 -->
          <version value="1"></version>

          <!-- 數據庫表 -->
          <list>
              <mapping class="com.zwb.args.dbpratice.model.Status"></mapping>
              <mapping class="com.zwb.args.dbpratice.model.User"></mapping>
          </list>
      </database>
 

 

       然後初始化DatabaseCache:   DatabaseCache cache = DatabaseCache.getInstance(this);     該操作應該是在Application中聲明,因為該動作涉及到數據庫和表的創建。   2.基本使用      聲明一個model類,繼承自BaseTable:    
   @Table(table = "status")
             public class Status extends BaseTable {
                 @Column
                 private String name;
                 @Column
                 private String statusId;

                 public void setName(String name) {
                     this.name = name;
                 }

                 public String getName() {
                     return name;
                 }

                 public void setStatusId(String id) {
                     this.statusId = id;
                 }

                 public String getStatusId() {
                     return statusId;
                 }
             }

 

     其中,@Table聲明的是該model對應的表的名字,@Column聲明的是該字段對應的數據庫中的類型。如果該字段的類型和數據庫中的類型不一致,可以通過@ColumnType來指定類型。   3.數據插入    Status status = new Status();  status.setName("轉發");  status.setStatusId("01");  InsertEvent insertStatusEvent = new InsertEvent();  insertStatusEvent.to(Status.class).insert(status); 4.數據更新    UpdateEvent updateEvent = new UpdateEvent();  updateEvent.to(Status.class).where("id", "01").update("name", "你好"); 5.數據查詢   List<Status> statusList = cache.from(Status.class).where("statusId", "01").find(); 這樣就是查詢Status表中的statusId為01的所有記錄。當然,也可以查詢所有數據: List<Status> statusList = cache.from(Status.class).findAll(); 6.數據讀取   DatabaseCache cache = DatabaseCache.getInstance(this); List<Status> statusList =  cache.readFromDb(Status.class);    該操作應該在Application中執行,然後執行相應的數據插入:    for(Status status : statusList){       InsertEvent insertEvent = new InsertEvent();       insertEvent.to(Status.class).insert(status); }  這樣數據就會從數據庫轉移到事件流中。   7.數據存儲 DatabaseCache cache = DatabaseCache.getInstance(this); cache.insertToDb(Status.class);  這樣就會將和Status有關的數據插入到數據庫中。   8.數據刪除 DeleteEvent deleteEvent = new DeleteEvent(); deleteEvent.to(Status.class).where("id", "01").delete();   這樣就是刪除id為01的數據。     如果是刪除某個集合的全部數據,則是:  
        List<Status> statuses = new ArrayList<Status>();
        for(int i = 0; i < 10; i++){
              Status status = new Status();
              status.setName("你好");
              status.setId("01");
              statuses.add(status);
        }
        deleteEvent.to(Status.class).deleteAll(statuses);

 

    如果是刪除表的全部數據: deleteEvent.to(Status.class).deleteAll();       這是目前的實現,後面會有時間講解一下實現的過程,具體的項目地址放在github上:https://github.com/wenjiang/EventStreamDB,有興趣可以上去看看,順便給個星星。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved