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

被折叠的 条评论
为什么被折叠?



