【发布时间】:2014-03-27 16:20:00
【问题描述】:
在我的 iPHone 应用程序中,我正在这样的 sqlite 中保存一个 NSArray。
-(void)saveData
NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:MyArray];
sqlite3_stmt *statement;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO ARRAY(PROFILE) VALUES (\"%@\")",dataFromArray];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(@"Saved Succesfully");
}
else {
// NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(contactDB));
NSLog(@"Not saved %d",sqlite3_finalize(statement));
}
sqlite3_finalize(statement);
sqlite3_close(contactDB);
}
}
数据保存成功。
现在我尝试像这样获取保存的数据-
-(void)fetchData{
const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM ARRAY"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
NSString *MYstring = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
NSData* data = [MYstring dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"data---%@",data);
NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
sqlite3_finalize(statement);
}
sqlite3_close(contactDB);
}
}
我正在像这样获得“MYstring”的打印值
<62706c69 73743030 d4000100 02000300 04000500 0806cb06 cc542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d100 06000754 726f6f74 8001af11 022a0009 000a0017 00180019 001a0080 00810082 00830084 00850086 00870088 0089008a 008b008c 008d008e 008f0090 00910092 00930094 00950096 00970098 0099009a 009b009c 009d009e 009f00a0 00a100a2 00a300a4 00a500a6 00a700a8 00a900aa 00ab00ac 00ad00ae 00af00b0 00b100b5 00bd00c0 00c300c6 00c900cc 00cf00d2 00d500d8 00db00de 00e100e4 00e700ea 00ed00f0 00fd0105 0108010b 010e0111 01140117 011a011d 01200122 0127012a 012d0130 01330136 0139013c 013f0142 01450148 014b014e 01510154 0159015e 01610164 0169016f 018101a1 01a201a3 01a401a5 01a601a7 01a801a9 01aa01ab 01ac01ad 01ae01af 01b201b5 01b801bb 01be01c1 01c401c7 01ca01cd 01d001d3 01d601d9 01f901fa 01fb01fc>
但是当我尝试使用 NSKeyedUnarchiver 从数据创建 NSArray 时 - 应用程序崩溃并显示此错误
-[__NSCFData objectForKey:]: unrecognized selector sent to instance
我在哪里犯了错误? 请帮我找回保存的数组,在此先感谢。
【问题讨论】:
-
您必须将数据转换回其他对象类型。
-[__NSCFData objectForKey:]: unrecognized selector sent to instance告诉你你已经在一个 NSData 对象上使用了objectForKey方法......这表明你可能真的需要它作为一个 NSDictionary。 -
执行
NSLog("%@", dataFromArray);并计算未转义的引号。 -
上面的“无法识别的选择器”异常是从哪里来的??我们没有看到您尝试将列表中的任何内容编入索引。您是在索引
myArrayFromDB还是在索引data? -
@HotLicks 首先我将我的 NSArray 转换为 NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:MyArray];然后保存在数据库中。检索时我无法将此数据转换回数组
-
我明白了,但这不是我问的。您执行 NSKeyedArchiver 取消归档...但随后报告索引 NSData 的错误。你会让我们相信 unarchive 返回一个 NSData???
标签: ios objective-c sqlite nsarray nsdata