項目中經常遇到數據持久化的問題,直接使用FMDB比較麻煩,我想直接存Model數據源,然后直接建表,存儲。
思路是這樣的:
1. 建表,傳入Model的Class,根據Model的Class拿到Model里面的所有成員變量,然后把成員變量拼接成SQL語句,然后執行,根據Model的成員變量自動建表。 2. 存,傳入裝有Model數據的數組Arr,或者直接Model數據,使用Runtime拿到這個Model的鍵值對,然后拼接成插入SQL語句。 3. 取。取比較多樣化,可以去整個表數據,也可以根據條件去取。當取到數據之后,弄成字典鍵值對。然后根據這個ModelClass創建對象,然后使用鍵值對給這個Model賦值,存入數組,然后傳出。
1.建表
/** * 創建表 * * @param tabName 表名 * @param model 數據model * * @return */ (instancetype)instantiationSqlTabName:(NSString *)tabName WithModelClass:(Class)modelClass{ NSString* sql=[NSString stringWithFormat:@quot;create table if not exists %@ (id integer primary key autoincrement quot;,tabName]; for (NSString *str in [modelClass GetPropertyKey]) { NSString *strq = [NSString stringWithFormat:@quot;,%@ quot;,str]; sql = [sql stringByAppendingString:strq]; } sql = [sql stringByAppendingString:@quot;)quot;]; NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName=[doc stringByAppendingPathComponent:[NSString stringWithFormat:@quot;sql.sqlitequot;]]; NSLog(@quot;%@quot;,fileName); ZCSqlTool *sqltool = [ZCSqlTool new]; sqltool.db = [[FMDatabase alloc]initWithPath:fileName]; if ([sqltool.db open]) { [sqltool.db executeUpdate:sql]; }else{ NSLog(@quot;創建失敗quot;); } return sqltool; }
2.存
/** * 插入數據 * * @param tabName 表名 * @param data 數據 * @param isDelete 是否清空該表之前的數據 * * @return */ - (BOOL)insertDataTabName:(NSString *)tabName WithData:(id)data WithdeleteFrom:(BOOL)isDelete{ if (isDelete == YES) { NSString *sql = [NSString stringWithFormat:@quot;delete from %@quot;,tabName]; BOOL isDeleteResult = [self.db executeUpdate:sql]; if (isDeleteResult) { return [self carriedOutInsertDataTabName:tabName WithDatas:data]; }else{ NSLog(@quot;刪除失敗quot;); return NO; } } return [self carriedOutInsertDataTabName:tabName WithDatas:data]; }
3.取
- (BOOL)conditionalDeletionTabName:(NSString *)tableName condition:(NSString *)condition,...NS_REQUIRES_NIL_TERMINATION{ va_list ap; va_start(ap, condition); NSString *str; NSString *str1 = [[condition componentsSeparatedByString:@quot;=quot;] firstObject]; NSString *str2 = [[condition componentsSeparatedByString:@quot;=quot;] lastObject]; NSString *sqlStr = [NSString stringWithFormat:@quot;delete from %@ where %@ = \quot;%@\quot;quot;,tableName,str1,str2]; while ((str=va_arg(ap, NSString*))) { NSArray *arr = [str componentsSeparatedByString:@quot;=quot;]; if (arr.count == 2 [[arr lastObject] length] gt; 0) { sqlStr = [NSString stringWithFormat:@quot;%@ and %@ = \quot;%@\quot;quot;,sqlStr,[arr firstObject],[arr lastObject]]; }else { NSLog(@quot;請輸入正確格式的數據quot;); return nil; } } va_end(ap); BOOL isInsertData; if ([self.db open]) { isInsertData = http://www.tuicool.com/articles/[self.db executeUpdate:sqlStr]; [self.db close]; } return isInsertData; }
直接存入Model數據,取也是取得就是Model數組。超級方便。不管是緩存 還是其他 業務,兩句代碼搞定一切
Tags: FMDB iOS開發
文章來源:http://www.jianshu.com/p/207087278828