打造android ORM架構opendroid(五)——資料更新的實現

來源:互聯網
上載者:User

標籤:opendroid   orm   架構   

在上一篇部落格《打造android ORM架構opendroid(四)——優雅的刪除資料》中,我們介紹了opendroid是如何優雅的從資料庫中刪除資料的,也可以看到opendroid的設計是如此的簡單,其實opendroid只是我作為興趣或者說是抱著試試的態度寫的,當然它肯定存在諸多不足,但是這並不影響我們去瞭解一個orm架構的流程。

廢話不說了,下面進入主題,今天我選擇去瞭解的是opendroid的update流程,其實,對於已經瞭解了delete操作的朋友們來說,今天的update流程肯定是如此的熟悉,因為它的大體流程和delete操作基本一致, 只是多了一步資料的對應。

按照慣例,我們先來熟悉一下opendroid是如何更新一條資料的。


Student stu = new Student();  stu.setStuName("loader");  stu.update(4); 


Student stu = new Student();  stu.setStuName("loader");  stu.update("_id>?", "4");

ContentValues cv = new ContentValues();  cv.put("stuName", "loader");  OpenDroid.update(Student.class, cv, "_id>? or name like ?", "1", "%q%");

好了,opendroid就提供了這三種方式的更新操作。其中第三種是使用ContentValues的形式更新,相信大家肯定很熟悉了。

哦對了,提前透漏一下,其實和delete一樣,這三種方式最後還是會歸位到一個方法上。


首先我們來定位到第一個update的源碼上。

/**  * 更新資料  * @param ids 要更新資料的id  * @return 影響行數  */  public int update(int... ids) {      try {          Class<OpenDroid> klass = (Class<OpenDroid>) getClass();          ContentValues cv = new ContentValues();          generateData(klass, cv);                        if(ids.length == 0) {              return update(klass, cv, null, null);          }                        StringBuilder builder = new StringBuilder("_id in (");          String[] whereArgs = new String[ids.length];          buildIn(builder, whereArgs, ids);                        return update(klass, cv, builder.toString(), whereArgs);      } catch (Exception e) {          e.printStackTrace();      }      return -1;  }

第8行,我們擷取了當前對象的Class,目的就是要通過反射來擷取它裡面的欄位和名字。

接下來new了一個ContentValues對象,還記得上面我說過“這三種方式最後還是會歸位到一個方法上“, 從這裡我們大體可以猜到,最後都歸位到

OpenDroid.update(Student.class, cv, "_id>? or name like ?", "1", "%q%");
  

這個方法上了。保留著這個猜測,繼續分析代碼。

緊接著一個generateData方法,這個方法我們曾經在《打造android ORM架構opendroid(三)——持久化資料》中詳細的去分析過,如果你好不清楚這個方法的作用,可以去參考前面的部落格。

12~14行,通過判斷如果沒有傳任何id,則可能是更新全部資料,這裡調用了靜態update方法,最後兩個參數都傳的null。

16~18這三行代碼,大家應該還熟悉了吧,我們在講解delete的時候也有這麼三句話,這三句話就是構建一個in的sql語句,並設定它的參數,如果你不太熟悉它,可以參考《打造android ORM架構opendroid(四)——優雅的刪除資料》,這篇部落格中對buildIn方法也做了說明,這裡就不重複去說了。

該方法的最後,同樣調用了一個靜態update方法,並返回了影響行數。


接下來,我們來定位到第二個update方法中一探究竟!

/**  * 更新資料  * @param where 條件  * @param whereArgs 條件參數  * @return 影響行數  */  public int update(String where, String... whereArgs) {      try {          Class<OpenDroid> klass = (Class<OpenDroid>) getClass();          ContentValues cv = new ContentValues();          generateData(klass, cv);                        return update(klass, cv, where, whereArgs);      } catch (Exception e) {          e.printStackTrace();      }      return -1;  }


其實這個方法和上面的很想,只是上面的需要在update方法裡去組合條件,而這裡的條件由使用者傳入,所以這個方法我們也不多講了,接下來我們來看看三兄弟會合的地方,也就是第三方方式調用的那個靜態方法!(哦,對了,這裡驗證上面我們那個猜測是正確的!)

/**  * 更新資料  * @param klass 要更新的表對應的class  * @param cv 要更新的資料  * @param where where條件  * @param whereArgs 條件的參數  * @return 影響行數  */  public static <T extends OpenDroid> int update(Class<T> klass, ContentValues cv,          String where, String... whereArgs) {      String tableName = klass.getSimpleName();      return CRUD.update(tableName, cv, where, whereArgs, sSqliteDatabase);  }

對於代碼控來說,確實夠令人失望了,代碼只有兩行!還沒有注釋多! 尼瑪!(心裡,千萬隻草泥馬飛奔而過)

1/2行代碼擷取了klass的類名,也就是我們要操作的表名。

2/2行,直接調用了CRUD.update方法去更新資料庫,又是CRUD...我們去看看吧。

/**  * 更新資料  * @param tableName 表名  * @param cv 更新的資料  * @param where 更新的條件  * @param whereArgs 更新的條件參數  * @param db 資料庫  * @return 影響行數  */  protected static <T extends OpenDroid> int update(String tableName, ContentValues cv,          String where, String[] whereArgs, SQLiteDatabase db) {      int count = db.update(tableName, cv, where, whereArgs);      return count;  }


好吧,又是兩行代碼, 而且直接調用了SQLiteDatabase的update方法去更新資料,走到這一步,要使用的資料肯定已經都準備好了。tableName我們在前面已經擷取了,ContentValues是用過generateData來填充的或者使用者自己new的,where和whereArgs不管是根據id更新還是通過條件更新的,我們都已經確定了。這裡只需要調用android原生的update方法去更新資料庫就ok了,最後返回了影響行數。


今天的update操作確實夠簡單,原因是,我們的很多代碼都是在前面幾篇部落格中詳細說明了,如果你還不清楚裡面的一些細節,可以再花幾分鐘去看看前面的幾篇部落格。


來總結一下opendroid的update流程吧。

1、在商務邏輯中可以通過三種update方法去更新資料,除了一種靜態,另外兩種都需要在bean對象上操作。

2、不管哪種操作,最後都會到OpenDroid.update(Class<T> klass, ContentValues cv,String where, String... whereArgs)這個方法上。

3、接著通過CRUD.update方法來調用android原生的upate方法來更新資料庫,並依次返回影響行數。


在完成了update操作的分析後,opendroid的基本操作已經完成了一大部分,現在只剩下select操作沒去分析,相信大家現在完全可以照這opendroid的思路去做一個自己的ORM架構了。當然,下面的部落格還會繼續完成select操作的分析,當然還會有opendroid的資料庫升級機制。


opendroid的開源地址:http://git.oschina.net/qibin/OpenDroid









打造android ORM架構opendroid(五)——資料更新的實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.