FMDB中读取原数据,然后insert更改数据,保存后再读取时数据变化了。

这段代码展示了如何在FMDB中读取数据,使用insert方法更新数据,然后验证保存后的数据是否已更改。测试方法包括获取模型数据,设置属性值,插入数据到数据库,再读取数据以确认更新成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FMDB中读取原数据,然后insert更改数据,保存后再读取时数据变化了。


-(void)testsetTableData{

    

    __blockSSSSagyoshijiModel *sagyoshijiModel;  // 表中的模型

    NSError *dbError;

    

    NSString *kojicd =@"1";    //表中的主key

    NSString *kokucd =@"2";

    NSString *sagyoymd =@"3";

    

    dispatch_group_t dlgroup =dispatch_group_create();

    dispatch_group_enter(dlgroup);

     //获取数据的方法

    [SSSSagyoshiji ModelgetTableData:kojicd kokucd:kokucd sagyoymd:sagyoymdhandler:^(SSSSagyoshijiModel *result,NSError *error) {

        

        if (error) {

            XCTAssert(false);

        }

        else {

            sagyoshijiModel = result;  // 给模型进行赋值

        }

        dispatch_group_leave(dlgroup);

    }];

    dispatch_group_wait(dlgroup,DISPATCH_TIME_FOREVER);


    NSString *testyoteihyonm1 =@"yotei";


    sagyoshijiModel.yoteihyonm1 = testyoteihyonm1;

    

//    FMDatabase *db = [SWKDataAccessManager openDatabase];

//    [sagyoshijiModel deleteFromTable:db error:&dbError];    // 删除数据

//    [db commit];

//    [db close];

    

    dbError = nil;

    

    FMDatabase *db = [SWKDataAccessManageropenDatabase];

    [sagyoshijiModel insert:dberror:&dbError];

    [db commit];

// DB数据文件放的地方

 NSLog(@"DB file is located at %@",[NSHomeDirectory()stringByAppendingString:@"Documents"]);


    [db close];

    

    XCTAssertTrue(dbError ==nil);

    

    dispatch_group_enter(dlgroup);

    

    sagyoymd = testYmd;

// 更改后的数据再一次进行读取

    [SSSSagyoshijiModelgetTableData:kojicd kokucd:kokucd sagyoymd:sagyoymdhandler:^(SSSSagyoshijiModel *result,NSError *error) {

        

        if (error) {

            XCTAssert(false);

        }

        else {

            sagyoshijiModel = result;

        }

        dispatch_group_leave(dlgroup);

    }];

    

    dispatch_group_wait(dlgroup,DISPATCH_TIME_FOREVER);

    

     //内容确定

    XCTAssertTrue([sagyoshijiModel.yoteihyonm1isEqualToString:testyoteihyonm1]);

}


///////////////////////////////////////////////////////////////////////////////////////


+ (void)getTableData:(nonnullNSString *)kojicd

              kokucd:(nonnullNSString *)kokucd

            sagyoymd:(nonnullNSString *)sagyoymd

             handler:(nonnullvoid (^)(SSSSagyoshijiModel *_Nullable, NSError *_Nullable))handler;

{

    NSMutableString *sql = [NSMutableStringstringWithString:@""];

    NSMutableArray *values = [NSMutableArrayarray];


    // 生成SQL语句 

    [sql appendString:@"SELECT * "];

    [sql appendString:@" FROM sagyoshiji "];

    [sql appendString:@" WHERE kojicd = ? AND kokucd = ? AND sagyoymd = ?"];

    [values addObjectsFromArray:@[kojicd, kokucd, sagyoymd]];

    

    // DB访问

    [SWKDataAccessManagerexecuteQuery:sql values:values loadTarget:[selfclass] handler:^(NSArray *acquiredDataSet,NSError *error) {

        

        SSSSagyoshijiModel *result;

        if (!error)

        {

            if (acquiredDataSet.count !=1)

            {

           

                // TODO:错误

            }

            else

            {

                result = acquiredDataSet[0];

            }

        }

        

        if (handler)

        {

            handler(result, error);

        }

    }];

}


///////////////////////////////////////////////////////////////////////////////////////

+ (void)executeQuery:(NSString *)sql values:(NSArray *)values loadTarget:(Class)loadTarget handler:(void(^)(NSArray *,NSError *))handler

{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        NSError *error =nil;

        NSArray *array = [NSMutableArrayarray];

        FMDatabase *db;

        

        @try {

            // 打开DB

            db = [self openDatabase];

            if (db)

            {

                //实行

                array = [selfexecuteQuery:sql values:values loadTarget:loadTargetdb:db error:&error];

            }

        }

        @catch (NSException *exception) {

            // TODO:

            NSLog(@"DB Access Error:%@", exception);

            error = [NSErrorerrorWithDomain:exception.namecode:99userInfo:nil];

        }

        @finally {

            if (db)

            {

                [db close];

            }

        }

       

        if (handler)

        {

            handler(array, error);

        }

    });

}


///////////////////////////////////////////////////////////////////////////////////////

+ (NSArray *)executeQuery:(NSString *)sql values:(NSArray *)values loadTarget:(Class)loadTarget db:(FMDatabase *)db error:(NSError *__autoreleasing *)error

{

    NSMutableArray *array = [NSMutableArrayarray];


    FMResultSet * ret = [dbexecuteQuery:sql values:values error:error];

    if (ret)

    {

        //得出结果

        while ([retnext]) {

            //生成实例

            SWKDataModel *target = [[loadTargetalloc] init];

            [target configureValuesWithResultSet:ret];

            

            [array addObject:target];

        }

    }

    

    return array;

}


///////////////////////////////////////////////////////////////////////////////////////


- (void)configureValuesWithResultSet:(FMResultSet *)resultSet

{

    NSMutableDictionary *columnMap = [resultSetcolumnNameToIndexMap];

    

    // 同名设置值

    [columnMap enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL *_Nonnull stop) {

        if ((![resultSetcolumnIsNull:key])

            && ([self respondsToSelector:NSSelectorFromString(key)]))

        {

            id val = [resultSetobjectForColumnName:key];

            [selfsetValue:val forKey:key];

        }

    }];

}


///////////////////////////////////////////////////////////////////////////////////////


- (BOOL)insert:(FMDatabase *)db error:(NSError *__autoreleasing *)error

{

    // 获取表名

    NSString *tblName = [selfgetTableName];

    //获取数据

    NSDictionary *data = [selfconvertToDBUpdateData];

    

    //更新数据

    BOOL ret = [SWKDataAccessManagerinsertTable:tblName data:data db:dberror:error];

    

    return ret;

}


///////////////////////////////////////////////////////////////////////////////////////


- (NSDictionary *)convertToDBUpdateData

{

    NSMutableDictionary *data = [NSMutableDictionarydictionary];

    

    // 得到属性列表

    NSArray *classes = [selfgetClasses];

    for (Class clsin classes)

    {

        unsignedint outCount, i;

        objc_property_t *properties =class_copyPropertyList(cls, &outCount);

        

        for(i =0; i < outCount; i++) {

            objc_property_t property = properties[i];

        

            constchar *propName = property_getName(property);

            constchar *propType = property_getAttributes(property);

            NSString *propertyName = [NSStringstringWithUTF8String:propName];

            NSString *propertyType = [NSStringstringWithUTF8String:propType];

            

           //对象属性下面还有对象的情况下的处理,多层结构

            if (([selfisDBMember:propertyName])

                && (![propertyType containsString:@"NSArray"])

                && (![propertyType containsString:@"NSMutableArray"]))

            {

              //到这里遍历到每个属性,每个属性在之前已经赋值了,key已经有value了,再次形成val对象,作为value对象。

                id val = [self valueForKey:propertyName];

          

                [data setObject:val ==nil ? [NSNullnull] : val forKey:propertyName];

            }

        }

    }

    return data;

}


///////////////////////////////////////////////////////////////////////////////////////


- (BOOL)isDBMember:(NSString *)propName

{

    returnYES;

}


///////////////////////////////////////////////////////////////////////////////////////

+ (BOOL)insertTable:(NSString *)tableName data:(NSDictionary *)data db:(FMDatabase *)db error:(NSError *__autoreleasing *)error

{

    __blockBOOL ret = NO;

    

    if ((data) && (data.count >0))

    {

        NSMutableString *clmns = [[NSMutableStringalloc] init];

        NSMutableString *placeHolder = [[NSMutableStringalloc] init];

        NSMutableArray *values = [NSMutableArrayarray];

        

        [data enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key, id_Nonnull obj, BOOL *_Nonnull stop) {

            if ((!obj) || (![objisKindOfClass:[NSArrayclass]]))

            {

                NSString *clmnName = key;

                

                // INSERT文作成

                if ([clmnslength] == 0)

                {

                    [clmns appendFormat:@"'%@'" , clmnName];

                }

                else

                {

                    [clmns appendFormat:@", '%@'", clmnName];

                }

                

                // Value用プレースホルダー作成

                if ([placeHolderlength] == 0)

                {

                    [placeHolder appendString:@"?"];

                }

                else

                {

                    [placeHolder appendString:@", ?"];

                }

                

               

                [values addObject:obj ==nil ? [NSNullnull] : obj];

            }

        }];

        

        if ([clmnslength] > 0)

        {

            // 结合

            NSString *sql = [NSStringstringWithFormat:@"INSERT INTO %@ (%@) VALUES (%@);", tableName, clmns, placeHolder];

            

            // SQL实行

            ret = [db executeUpdate:sqlvalues:values error:error];

        }

    }

    

    return ret;

}


///////////////////////////////////////////////////////////////////////////////////////

//这个方法是在父类中写的,子类中也要写一个

- (NSString *)getTableName

{

    // 継承したクラスで実装する,///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
// iOS 主动抛出异常

    [NSExceptionraise:NSInternalInconsistencyExceptionformat:@"You must override %@ in a subclass",NSStringFromSelector(_cmd)];

    return@"";

}

//子类中要写的方法

- (NSString *)getTableName

{

    return@"sagyoshiji";

}




///////////////////////////////////////////////////////////////////////////////////////

- (BOOL)deleteFromTable:(FMDatabase *)db error:(NSError *__autoreleasing *)error

{

    // 対象テーブル名取得

    NSString *tblName = [self getTableName];

    // 条件取得

    NSDictionary *params = [self getRecordParams];

    

    // 削除

    BOOL ret = [SWKDataAccessManager deleteTable:tblName params:params db:dberror:error];

    

    return ret;

}

///////////////////////////////////////////////////////////////////////////////////////

+ (BOOL)deleteTable:(NSString *)tableName params:(NSDictionary *)params db:(FMDatabase *)db error:(NSError *__autoreleasing *)error

{

    BOOL ret =NO;

    

    NSMutableString *sql = [NSMutableStringstringWithFormat:@"DELETE FROM %@", tableName];

    NSMutableArray *values = [NSMutableArrayarray];

    

    if ((params) && (params.count >0))

    {

        // 条件式の追加

        NSMutableString *where = [[NSMutableStringalloc] initWithString:@""];

        [params enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key, id_Nonnull obj, BOOL *_Nonnull stop) {

            if ([wherelength] == 0)

            {

                [where appendFormat:@"%@=?", key];

            }

            else

            {

                [where appendFormat:@"AND %@=?", key];

            }

            [values addObject:obj ==nil ? [NSNullnull] : obj];

        }];

        [sql appendFormat:@" WHERE %@", where];

    }

    [sql appendString:@";"];

    

    // SQL实行

    ret = [db executeUpdate:sqlvalues:values error:error];

    

    return ret;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值