我正在iOS模擬器上測試,涉及隨MapBox iOS SDK一起分發的FMDB。這是一個我無法捕捉的錯誤,我在想我是否打破了一些我不知道的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
查詢也會產生想要的結果。
也許有這個問題做:https://github.com/ccgus/fmdb/issues/6 - 任何原因,你不能只是關閉語句緩存? – omz 2012-07-24 01:46:15
由於性能原因,我非常需要打開它。 Mattstevens說:「如果你的每一層嵌套使用一個唯一的關鍵字,那麼它應該按照預期工作。」我對這兩個查詢都使用了唯一鍵。 – huggie 2012-07-24 02:11:15
哇我評論說,行和我的整個程序似乎工作正常。你是如何谷歌的錯誤?發佈答案我會接受它。 – huggie 2012-07-24 03:21:03