iOS - 最易用的數據庫工具類 XWDatabase 開源

iOS - 最易用的數據庫工具類 XWDatabase 開源

XWDatabase GitHub 地址:github.com/qxuewei/XWD…git

XWDatabase 的亮點github

  • 將數據庫操做簡化到不可思議的程度,你甚至不須要知道數據庫的存在,固然更不須要寫 SQL 語句,你只須要直接操做模型便可對模型進行增刪改查的操做,她會根據模型動態在數據庫中建立以當前模型類名爲名稱的數據庫表,固然你也能夠自定義表名;
  • 她會根據模型的成員變量和成員變量的類型動態進行字段的設計,有多少成員變量,表中天然就會有多少字段與其對應,固然,你也能夠忽略其中的某些你不想存儲的成員變量,也能夠自定義字段的名稱;
  • 若是哪天模型的字段變化了,她會自動進行表中原有字段的更新,並且不管原表中有多少數據,都會一條不落的遷移到新表中;
  • 她的API簡單到只有一行代碼,你無需關注數據庫的開啓和關閉,一行代碼實現增刪改查和數據遷移;
  • 你甚至能夠在任何線程中調用她的API,她必定是線程安全的,不會出現多線程訪問同一個數據庫和死鎖的問題;
  • 數據操做是耗時操做,因此你無需手動開啓異步線程操做數據庫操做,她會統一在一個保活的異步線程中執行;
  • 她支持存儲常見的數據類型(int、long、signed、float、double、NSInteger、CGFloat、BOOL、NSString、NSMutableString、NSNumber、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSData、NSMutableData、UIImage、NSDate、NSURL、NSRange、CGRect、CGSize、CGPoint、自定義對象等的存儲);
  • 她還對二進制文件的存儲作了優化,好比同一張圖片表中全部數據都持有這張圖片對象,她在數據庫中只會有一份拷貝,竭盡她所能優化存儲空間。

筆鋒一轉,V1.0 版本會存在不少不足,但願各位前輩和大牛多多指正,多提 issues數據庫

下面簡述一下此庫的一些設計思路和使用方法數組

使用

1、增

1.保存一個模型
- (void)saveOnePerson
{
    XWPerson *person = [XWPerson testPerson:2];
    [XWDatabase saveModel:person completion:^(BOOL isSuccess) {

    }];
}
複製代碼

實例化一個對象, 調用 saveModel 方法。安全

2.保存多個模型
- (void)saveModels
{
    NSMutableArray *persons = [[NSMutableArray alloc] init];
    for (int i = 0; i < 1000; i++) {
        [persons addObject:[XWPerson testPerson:i]];
    }
    [XWDatabase saveModels:persons completion:^(BOOL isSuccess) {
        
    }];
}
複製代碼

實例化一堆對象, 調用 saveModels 方法。bash

2、刪

1.刪除一個模型
- (void)deleteModel
{
    XWPerson *person = [XWPerson new];
    person.cardID = @"1"; /// 指定想刪除的主鍵(或聯合主鍵)
    [XWDatabase deleteModel:person completion:^(BOOL isSuccess) {
        
    }];
}
複製代碼

實例化一個對象,爲主鍵賦值(得知道刪的是哪一個,讓她猜,臣妾作不到), 調用 deleteModel 方法。多線程

2.刪除此模型存儲的全部數據
- (void)clearModel
{
    [XWDatabase clearModel:XWPerson.class completion:^(BOOL isSuccess) {

    }];
}
複製代碼

調用 clearModel 方法,傳入想刪除的模型類app

3.選擇性刪除此模型存儲的數據
/// 刪除 age > 50 的數據
- (void)clearModel
{
    [XWDatabase clearModel:XWPerson.class condition:@"age > '50'" completion:^(BOOL isSuccess) {
        
    }];
}
複製代碼

調用 clearModel 方法,傳入想刪除的模型類和條件異步

3、改

1.更新某模型某個成員變量 (選擇性更新)
/// 更名
- (void)updateModel
{
    XWPerson *person = [XWPerson new];
    person.cardID = @"2";
    person.name = @"新名字";
    
    /// 自定義成員變量更新
    [XWDatabase updateModel:person updatePropertys:@[@"name"] completion:^(BOOL isSuccess) {
        
   }];
    
}
複製代碼

實例化一個對象,爲主鍵和有變化的成員變量賦值, 調用 updateModel 方法,傳入想更新的成員變量名稱。工具

2.更新某模型全部數據 (全量更新)
/// 根據傳入的模型總體更新
- (void)updateModel
{
    XWPerson *person = [XWPerson new];
    person.cardID = @"2";
    person.name = @"新名字";
    person.girls = @[@"小妹",@"校花",@"小baby"];
    
    /// 整個模型更新
    [XWDatabase saveModel:person completion:^(BOOL isSuccess) {
        
    }];
    
}
複製代碼

實例化一個對象, 調用 updateModel 方法,傳入想更新的模型。

4、查

1.根據主鍵查詢模型
- (void)getOnePerson
{
    XWPerson *person = [XWPerson new];
    person.cardID = @"81";
    [XWDatabase getModel:person completion:^(XWPerson * obj) {
        
    }];
}
複製代碼

實例化一個對象,爲主鍵賦值, 調用 getModel 方法。

2.查詢數據庫中全部該模型存儲的數據
- (void)getModels
{
    [XWDatabase getModels:XWPerson.class completion:^(NSArray * _Nullable objs) {
        
        
    }];
}
複製代碼

調用 getModels 方法,傳入模型類

3.查詢數據庫中全部該模型存儲的數據 - 按某成員變量排序
/// 獲取數據庫中全部該模型存儲的數據 - 按 age 字段降序排列
- (void)getModelsSortAge
{
    [XWDatabase getModels:XWPerson.class sortColumn:@"age" isOrderDesc:YES completion:^(NSArray * _Nullable objs) {
        
    }];
}
複製代碼

調用 getModels 方法,傳入模型類和要排序的字段

4.查詢數據庫中全部該模型存儲的數據 - 自定義查詢條件
/// 獲取數據庫中全部該模型存儲的數據 - 自定義查找條件 (例如模糊查詢 name 含 學偉 的數據)
- (void)getModelsCondition
{
    [XWDatabase getModels:XWPerson.class condition:@"name like '%學偉'" completion:^(NSArray * _Nullable objs) {
        
    }];
}
複製代碼

調用 getModels 方法,傳入模型類和查詢的條件

5.查詢數據庫中全部該模型存儲的數據 - 自定義查詢條件而且可按照某字段排序
/// 獲取數據庫中全部該模型存儲的數據 - 自定義查找條件可排序 (例如模糊查詢 name 含 學偉 的數據, 而且按 age 升序排序)
- (void)getModelsConditionSort
{
    [XWDatabase getModels:XWPerson.class sortColumn:@"age" isOrderDesc:NO condition:@"name like '%學偉'" completion:^(NSArray * _Nullable objs) {
        
    }];
}
複製代碼

調用 getModels 方法,傳入模型類和查詢的條件和排序的成員變量名稱

5、數據遷移

模型中成員變量發生變化,動態進行數據遷移
+ (void)initialize 
+ {
    [XWDatabase updateTable:self completion:^(BOOL isSuccess) {
        
    }];
複製代碼

在模型對象的 initialize 方法中 調用 updateTable 方法。之因此在 initialize 方法中調用是保證用戶無感知的狀況下在操做此模型進行數據操做時自動更新。

以上就是 XWDatabase V1.0 版本的全部功能示例。謝謝!

下面介紹一些使用規範和功能擴展。

六 、XWDatabaseModelProtocol 協議

/**
 主鍵 不可更改/惟一性
 
 @return 主鍵的屬性名
 */
+ (NSString *)xw_primaryKey;

/**
 聯合主鍵成員變量數組 (多個屬性共同定義主鍵) - 優先級大於 'xw_primaryKey'

 @return 聯合主鍵成員變量數組
 */
+ (NSArray < NSString * > *)xw_unionPrimaryKey;

/**
 自定義對象映射  (key: 成員變量名稱 value: 對象類)

 @return 自定義對象映射
 */
+ (NSDictionary *)xw_customModelMapping;

/**
 忽略不保存數據庫的屬性
 
 @return 忽略的屬性名數組
 */
+ (NSSet <NSString *>*)xw_ignoreColumnNames;

/**
 自定義字段名映射表 (默認成員變量即變量名, 可自定義字段名 key: 成員變量(屬性)名稱  value: 自定義數據庫表字段名)

 @return 自定義字段名映射表
 */
+ (NSDictionary *)xw_customColumnMapping;

/**
 自定義表名 (默認屬性類名)

 @return 自定義表名
 */
+ (NSString *)xw_customTableName;

複製代碼

當模型遵照 XWDatabaseModelProtocol 協議並選擇性實現其中某些方法時她便會更好的爲您服務。固然 主鍵 xw_primaryKey(或聯合主鍵 xw_unionPrimaryKey )是查詢和更新必需要實現的方法。

若是模型中成員變量存在其餘的自定義模型,那其餘的自定義模型須要聽從 NSCoding 協議並實現 initWithCoderencodeWithCoder 方法。 XWDatabase 中的 NSObject+XWModel 提供了一個宏能夠快速使自定義對象具有歸解檔的功能 XWCodingImplementation

設計思路

  1. 根據 runtime 獲取對象成員變量名稱和類型生成 建表 SQL 語句
  2. 根據當前對象成員變量名稱和原有數據庫表中字段排序後進行比較,有差別進行數據遷移
  3. 根據模型動態生成 SQL 語句
  4. 利用事務進行大數據量的操做
  5. 建立一個保活的子線程(使異步線程的 Runloop 保持活躍)進行數據庫操做,使用主線程隊列保證數據操做的同步
  6. 數據庫底層封裝自 FMDB
  7. 建立一個單獨存放圖片二進制的庫存儲二進制文件。真實表中存儲 二進制 文件的 hash 值已達到數據重用。

此庫支持 CocoaPod 集成:

pod 'XWDatabase'
複製代碼

項目源碼開源在 GitHub 中,連接: XWDatabase

做者:極客學偉 博客:blog.csdn.net/qxuewei/

相關文章
相關標籤/搜索