Android學習之 關於DB本地資料庫模組
一、傳統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資訊助手 歡迎大家掃一掃 關注小呂、給小呂留言!
相關文章
- 關於資料庫系統的學習資料庫
- 關於 android本地快取資料目錄Android快取
- 【DB2學習】遷移資料之EXPROTDB2
- Android學習探索之本地原生渲染 LaTeX資料公式Android公式
- 基於 Android 讀取微信本地 DB 資料 | 思維原理及技術分析Android
- Laravel 學習之資料庫遷移Laravel資料庫
- InnoDB學習(六)之資料庫鎖資料庫
- 關於資料結構的學習心得資料結構
- 模組學習之hashlib模組
- 關於學習資料庫開發的一點建議和忠告資料庫
- swoft 學習筆記之資料庫操作筆記資料庫
- jmeter學習指南之操作 mysql 資料庫JMeterMySql資料庫
- 向量資料庫之Lancedb學習記錄資料庫
- 關於Android ant build的學習AndroidUI
- 關於資料庫故障資料庫
- nginx學習之模組Nginx
- 【DB 2學習】檢視一個資料庫的配置檔案資料庫
- 資料庫學習資料庫
- 3.3.1 關於關閉資料庫資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(六)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(七)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(八)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十一)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十二)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十三)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十六)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十七)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十八)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(十九)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(二十)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(一)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(四)DB2資料庫
- 自己整理的學習資料——DB2 V8資料庫基礎(五)DB2資料庫
- 適用於rman增級備份之資料庫特性db block change tracking學習思路資料庫BloC
- DB資料庫面試資料庫面試
- 資料庫學習筆記之查詢表資料庫筆記
- 關於學習Web前端所需要的學習資料(免費送)Web前端
- Android Paging分頁庫的學習(一)—— 結合本地資料進行分頁載入Android