基于FMDB封裝-直接存Model,取Model

分類:技術 時間:2017-01-13

項目中經常遇到數據持久化的問題,直接使用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


ads
ads

相關文章
ads

相關文章

ad