Android學習之 關於DB本地資料庫模組

小呂-ICE發表於2014-07-18

一、傳統DB資料庫模組封裝

      1、繼承SQLiteOpenHelper,重寫OnCreate(SQLiteDatabase db)和OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法, 如下圖:

           

           


     2、在OnCreate(SQLiteDatabasedb)方法中初始化建立應用所有的資料庫表

           

        這裡跟一下程式碼,我們會發現他首先是把獲得每一個表的建表CREATE TABLE語句,然後execSQL該語句,這樣就完成了一個具體表的新建,如產品表的新建語句程式碼片段截圖如下:

            

        思考一下、你覺得這種方式好嗎?程式碼好看嗎?你是否想到以後表結構變動後的場景嗎?能否有一種更高效方式呢?動態生成sql語句?


       傳統DB模組程式碼 小小總結:

       以上我們可以很明顯的看到傳統DB模組的程式碼具有以下幾個缺點:

       缺點一:如果表欄位多,會顯得程式碼臃腫

       缺點二:程式碼靈活性差

       缺點三:維護性差


二、尋求新的DB設計思想

      思想:IOC註解   +  ORM對映

      機制:Java反射機制

                     

基本思路:

1、建立一個資料庫表對應的實體物件

2、通過註解的方式自定義表名、欄位名和預設值  [也可省略這一步]

3、通過獲取註解欄位資訊、反射實體類名和欄位名動態生成sql語句、

4、每一個實體Entity都將有一個Mapping對映類:TableInfo物件 對應著相應的資料庫表

      TableInfo物件包含實體類名、資料庫表名、主鍵key、其他欄位HashMap集合

5、操作實體類 == 間接性的操作DB資料  [資料可以直接做為物件使用]


例項:

一、非註解方式完成對實體的資料操作:    如:建立產品表並新增一條資料

     1、建立產品實體類Product.java,程式碼片段如下:

public class Product {
	private int id;   // 主鍵id
	private String itemNumber;  // 產品編號
	private String itemName;   //  產品名稱
	private double price;      //  價錢
	private String description;   // 產品描述
    private String imageUrl;    //  圖片URL
    
    public Product(){}
    
    public Product(String itemNumber, String itemName, double price,String description, String imageUrl) {
		this.itemNumber = itemNumber;
		this.itemName = itemName;
		this.price = price;
		this.description = description;
		this.imageUrl = imageUrl;
	}

	/** get/set方法 */
       ..........

      2、獲取對資料庫操作的入口類IceDB<小呂自己封裝的一個類>物件<獲取方式有很多種>,程式碼片段如下:

// IceDb icedb = IceDb.getIceDb(DbTestActivity.this);
   IceDb icedb = IceDb.getIceDb(DbTestActivity.this, "icetest.db", true);

     3、例項化實體物件資料、並對實體物件進行資料操作,程式碼片段如下:

		
		// 例項化產品物件、並初始化產品資料
		Product product = new Product("999", "蛋白粉", 255.5, "營養蛋白", "http://pic.xxx.jpg");
		// 儲存產品資訊到資料庫
		icedb.save(product);
		// 查詢所有的產品資訊
		List<Product> products = icedb.queryAll(Product.class);
		

      4、執行效果:

     我們可以使用Eclipse整合外掛sqlitemanager 檢視SQLite資料庫情況,如下圖生成產品實體類對映出來的資料表 com_ice_demo_entity_Product <表名= 包名_實體類名>

      

表資料情況如下圖:

      

      這裡我們可以看到 產品實體類 Product 通過對映生成的資料表名為 包名_實體類名,資料也都正常儲存進了資料庫、唯一缺陷就是這表名太醜啦!那我們能否通過配置自定義生成表名呢?答案是可以的、在做服務端開發使用Spring時 我們會大量的使用Ioc註解、那麼通過註解來配置表名、欄位名、預設值將是非常不錯的一種方案。


二、註解方式完成對實體的資料操作:      如:建立人員表並新增一條資料

      1、建立人員實體類Person.java <含註解>,程式碼片段如下:   

@Table(name = "t_person")
public class Person {
    @Column(name = "_id")
    @Key private int id;
    @Column(name = "name")
	private String name;
    @Column(name = "age", defaultValue = "23")   
	private int age;
    @Column(name = "sex", defaultValue = "男")
	private String sex;
    // 預設Column註解時  會生成表欄位名為屬性本身
    private boolean isMarryed;
    @Transient    // 註解 該屬性 標識為 該實體類欄位為非資料庫欄位
    private boolean flag;
 
    public Person(){}
    
    public Person(String name, int age, String sex, boolean isMarryed,
			boolean flag) {
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.isMarryed = isMarryed;
		this.flag = flag;
	}

	// ---get/set方法
        .........

      2、獲取對資料庫操作的入口類IceDB物件<獲取方式有很多種>,程式碼片段如下:

		
		// IceDb icedb = IceDb.getIceDb(DbTestActivity.this);
		IceDb icedb = IceDb.getIceDb(DbTestActivity.this, "icetest.db", true);

      3、例項化實體物件資料、並對實體物件進行資料操作

   // 例項化人員物件、並初始化人員資料
   Person p = new Person("ice", 24, "男", false, true);
   // 儲存人員資訊到資料庫
   icedb.save(p);
   // 查詢所有的人員資料
   List<Person> persons = icedb.queryAll(Person.class);
		<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">    </span>

     4、執行效果:

      生成人員實體類對映出來的資料表 t_person <通過註解屬性Table 定義的表名> 如下圖:

      

     表資料情況如下圖:

      

小結:相比前面的傳統DB模組程式碼,具有以下優點:

           1、易用性、簡化了DB的CURD操作,除去了用程式碼組拼sql語句的過程。

           2、增強了程式碼的可讀性、可維護性

           3、易用性


三、巧遇開源移動資料庫框架:Realm       

       前幾天在CSDN社群巧遇到開源移動資料庫框架:Realm

       下面是文章中部分內容的幾張截圖、也是簡單的介紹下該框架的特色

        

        可以看到 該框架雖然目前還只支援IOS平臺、但是他的特點中有介紹到 資料可以直接做為物件使用、

接下來有兩個demo例項將簡單介紹Realm在程式碼中如何用物件來運算元據

Realm程式碼示例:

      1、針對Objective-C:

       

      2、針對Swift:

       

      對於紅色圈起來的程式碼部分、Realm框架的設計思想   你能否產生共鳴感呢?

 

     PS: 小呂正在不斷的學習中完善自身、希望能與大家一起學習、交流... ...

              下面是我的微信公眾號:Ice資訊助手     歡迎大家掃一掃  關注小呂、給小呂留言!                                                                         

          



相關文章