2012-07-24 93 views
0

我正在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查詢也會產生想要的結果。

+0

也許有這個問題做:https://github.com/ccgus/fmdb/issues/6 - 任何原因,你不能只是關閉語句緩存? – omz 2012-07-24 01:46:15

+0

由於性能原因,我非常需要打開它。 Mattstevens說:「如果你的每一層嵌套使用一個唯一的關鍵字,那麼它應該按照預期工作。」我對這兩個查詢都使用了唯一鍵。 – huggie 2012-07-24 02:11:15

+0

哇我評論說,行和我的整個程序似乎工作正常。你是如何谷歌的錯誤?發佈答案我會接受它。 – huggie 2012-07-24 03:21:03

回答

0

我想評論一下,你編寫數據庫代碼和方法的方式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; 
} 
+0

是的,我只是寫任何重現錯誤,所以安排是不合邏輯的。 – huggie 2012-08-28 09:25:07

+0

那麼,使用SQLite + FMDB時的性能如何? – 2012-08-28 10:20:24

+0

我還沒有將它與核心數據進行比較,如果這就是你要求的。 – huggie 2012-08-29 04:14:23

相關問題