0

MapBox iOS SDK と共に配布されている FMDB を含む iOS シミュレーターでテストしています。これは私が捕まえることができないバグであり、私が知らないいくつかの FMDB ルールに違反しているのか、それともどこかで深刻なメモリ破損が発生しているのか疑問に思っています (ただし、問題はすでに数行にまで絞り込まれています)。次のコードは、「should not be here」とコメントされている行に実行されます。また、以下のラベルが付いた行をコメント アウトすると、"should be here" になります。

- (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;
}

コードを application:didFinishLaunchingWithOptions に配置したのは、他のメモリが台無しになる前に最初に実行できるようにするためです。(私がこれについて正しければ、これはすべてのビューの前に来るはずです。) しかし、どこに問題があるのか​​ わかりません。繰り返しますが、"Correct when" と書かれている 2 行のいずれかをコメント アウトすると、目的の結果が得られます。SELECT *または、の代わりにクエリを実行してSELECT id, type, stateも、目的の結果が得られます。

4

1 に答える 1

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;
}
于 2012-08-28T07:40:18.260 に答える