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