前言:
選一個數據庫作為主力,realm,coredata,sqlite這三個我糾結之后還是選了sqlite. 有很多原因,不展開了. 但fmdb用起來有一些蛋疼.很多重復代碼. 有必要做個工具提高效率了.
在決定自己封裝fmdb
之前.已經有人做了相關的東西.不過有些地方還是不能滿足我的需求. 比如我想特指某個字符串做主鍵. 于是自己動手實現了.但在實現過程中發現了疑慮. model制表肯定牽涉到映射相關的問題. 想來想去. 要做個通用的數據庫工具. 還是做成能夠默認自增數字主鍵最合適. 那么, 要解決我的需求. 其實還可以用sql關鍵字修飾某個字段 .
XTFMDB
特性
- Model直接存儲.獲取. 無需再轉換
- 增刪改查. 脫離sql語句
- 主鍵自增. 插入不需設主鍵. pkid
- Model滿足. 無容器, 無嵌套. model的第一個屬性必須是數字主鍵.且命名中須包含'pkid'.默認為pkid
- 任何操作. 線程安全
- 批量操作支持實務. 支持操作失敗事務回滾. 且線程安全
- 支持 每個字段自定義設置關鍵字. 已經集成默認關鍵字, 以下情況無需再寫( NOT NULL, DEFAULT''字符類型默認值,DEFAULT'0'數字類型默認值 )
- 可指定哪些字段不參與建表.
使用方法
導入 XTFMDB.h
初始化 在app啟動時調用配置函數
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 在這初始化數據庫
[[XTFMDBbase sharedInstance] configureDB:@"akateason"] ;
return YES;
}
使用CRUD
先創建一個自定義模型類Model1
支持兩種建模方式
方式1) XTDBModel的子類, 可以直接實現對數據庫操作增刪改查等.并且無需設置主鍵pkid
@interface Model1 : XTDBModel
// 無需設置主鍵 默認 pkid
@property (nonatomic) int age ;
@property (nonatomic) float floatVal ;
@property (nonatomic) long long tick ;
@property (nonatomic,copy) NSString *title ;
@property (nonatomic,copy) NSString *abcabc ; // 不想在表里出現這個 !!
@end
方式2) 任意創建一個類, 可以直接實現對數據庫操作增刪改查等.但需要手動設置主鍵pkid
@interface Model1 : NSObject
@property (nonatomic) int pkid ; // primary key
@property (nonatomic) int age ;
@property (nonatomic) float floatVal ;
@property (nonatomic) long long tick ;
@property (nonatomic,copy) NSString *title ;
@property (nonatomic,copy) NSString *abcabc ; // 不想在表里出現這個 !!
@end
可配置各個字段關鍵字
注意:
- 在.m中覆蓋基類
modelPropertiesSqliteKeywords
方法. 返回一個Dictionary. key為字段名. val為關鍵字, 加入想要多個關鍵字,以空格隔開即可 . - 無需添加
NOT NULL
和DEFAULT
關鍵字. (已集成) .
+ (NSDictionary *)modelPropertiesSqliteKeywords
{
return @{
@"title" : @"UNIQUE" , //
...
} ;
}
配置不想參與建表的字段
在.m中覆蓋基類ignoreProperties方法. 返回Array. 列出不想參與建表的字段
+ (NSArray *)ignoreProperties
{
return @[
@"abcabc" ,
...
] ;
}
只需要導入`"XTFMDB.h"就可使用
創建表
- 馬上創建一張名為
Model1
的數據庫表
[Model1 xt_createTable] ; // [Model1 createTable] ; 當Model1是XTDBModel子類時,也可以用這個方法.以下方法均可以同上.
插入
- 插入單個
// 生成aModel對象. 直接插入
int lastRowID = [aModel xt_insert] ; // 默認返回Sqlite LastRowId
- 批量插入
Bool isSuccess = [Model1 xt_insertList:modelList] ;
更新
- 更新單個
Bool isSuccess = [aModel xt_update] ;
- 批量更新
Bool isSuccess = [Model1 xt_updateList:modelList] ;
查詢
- 查詢表中所有數據
NSArray *list = [Model1 xt_selectAll] ;
- 按條件查詢
NSArray *list = [Model1 xt_selectWhere:@" title = 'aaaaaa' "] ; // 直接傳入where條件即可
- 按條件查詢單個
Model1 *model = [Model1 xt_findFirstWhere:@"pkid == 2"] ;
- 按條件查詢是否包含
BOOL isContained = [Model1 xt_hasModelWhere:@"pkid == 1"] ;
刪除
- 刪除當前Model
BOOL isDel = [aModel xt_deleteModel] ;
- 按條件刪除某Model
BOOL isDel = [Model1 xt_deleteModelWhere:@" title == 'aaa' "] ;
- 刪除本表
BOOL isDel = [Model1 xt_dropTable] ;
源碼在此
你的star是我的動力
有任何疑問或建議. 歡迎在github或博客里issue我. 輕噴.
接前言提問:
那個問題用unique關鍵字解決了.
此外我還有一些奇怪的想法留在文末.
這個工具幾乎可以處理客戶端通常遇到的關系型表的問題.
倘若不換數據庫. 是否能夠去實現一些類似nosql非關系型的存儲.
應該是可以的.
我會在下一篇文章給出我的答案 以及這個想法的由來和適用場景 .