我正在iOS模拟器上进行测试,该模拟器涉及与MapBox iOS SDK一起分发的FMDB。这是一个我抓不到的错误,我想知道我是否违反了一些我不知道的FMDB规则,或者我在某个地方内存严重损坏(但我已经将问题缩小到了几行)。下面的代码将运行到注释为"不应该在这里"的行中。注释掉下面标记的任何一行都会变成"应该在这里"。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
NSString * sql_gdb = @"/Users/t2wu/Library/Application Support/iPhone Simulator/5.1/Applications/BB193B94-2549-49DB-9BBB-C66D76743515/Library/Application Support/Poki.OfflineSpotty/fremont_spatial.gdb";
FMDatabase * db = [FMDatabase databaseWithPath:sql_gdb];
if ([db open]) {
db.shouldCacheStatements = TRUE; // Correct when this line is commented out
[self fooDB:db];
FMResultSet * debug1 = [db executeQuery:@"SELECT id, type, state FROM payloads WHERE id=?", [NSNumber numberWithLong:2]];
BOOL DOESFIND1 = FALSE;
while ([debug1 next]) {
DOESFIND1 = TRUE;
NSLog(@"Does find."); // Should be here.
}
if (DOESFIND1 == FALSE) {
NSLog(@"Does not find"); // Should not be here.
}
}
return YES;
}
-(void) fooDB: (FMDatabase *)db
{
NSLog(@"SELECT id, type, state FROM payloads WHERE id=%@", [NSNumber numberWithLong:1]);
FMResultSet * result = [db executeQuery:@"SELECT id, type, state FROM payloads WHERE id=?", [NSNumber numberWithLong:1]]; // Correct when changed to "SELECT * FROM"
while ([result next]) {
return; // Correct when this line is commented out.
}
return;
}
我已经把代码放在了应用程序中:didFinishLaunchingWithOptions,这样我就可以在其他内存被破坏之前第一件事就是运行它。(如果我是正确的,这应该放在所有观点之前。)但我不知道问题出在哪里。再说一遍,把"何时纠正"这两行中的任何一行都注释掉,都会产生预期的结果。或者用SELECT *
而不是SELECT id, type, state
进行查询也会产生所需的结果。
我想评论一下,您编写数据库代码和方法fooDB
的方式有点难以阅读。
尝试以下操作:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self fooDB];
return YES;
}
-(BOOL) fooDB
{
NSString * sql_gdb = @"/Users/t2wu/Library/Application Support/iPhone Simulator/5.1/Applications/BB193B94-2549-49DB-9BBB-C66D76743515/Library/Application Support/Poki.OfflineSpotty/fremont_spatial.gdb";
FMDatabase * db = [FMDatabase databaseWithPath:sql_gdb];
if (![db open]) {
NSLog(@"Could not open DB.");
return NO;
}
FMResultSet * result = [db executeQuery:@"SELECT id, type, state FROM payloads WHERE id = ?", [NSNumber numberWithLong:1]];
while ([result next]) {
//DO SOMETHING HERE
}
[result close];
[db close];
return YES;
}