0

これらの2つの機能を使用しているコントローラービューがあります:


[appDelegate getFichesInfo:[[self.fichesCategory idModuleFiche] intValue] ]; //first function
self.fiche = (Fiche *)[appDelegate.fichesInfo objectAtIndex:0];


[appDelegate getFichesVisuels:[[self.fiche idFiche] intValue] ];  //second function not working
self.fiche = (Fiche *)[appDelegate.fichesInfo objectAtIndex:0];

したがって、私の ressourceManager では、2 番目の関数の詳細を次に示します。


- (void)getFichesVisuels:(int)value {

    fichesVisuels = [[NSMutableArray alloc] init];

    sqlite3 *database;

    if(sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK) {
        sqlite3_reset(getFichesVisuelsStatement);


        sqlite3_bind_int(getFichesVisuelsStatement, 1,  value);

        while(sqlite3_step(getFichesVisuelsStatement) == SQLITE_ROW) {


            NSString *aTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(getFichesVisuelsStatement , 7)];
            NSString *aLpath = [NSString stringWithUTF8String:(char *)sqlite3_column_text(getFichesVisuelsStatement , 8)];

            Visuel *visuel = [[Visuel alloc] initWithName:aTitle lpath:aLpath];

            [fichesVisuels addObject:visuel];
        }

    }
    sqlite3_close(database);
}

問題は、2 番目の関数が機能していないことです (ライブラリ ルーチンが順不同で呼び出されます)。これは、1 番目の関数を同じ方法で既に呼び出しているためです (引数を使用して多くのクエリを同時に実行できるようにしたい)。NSInvocation を使用するとこの問題を解決できると聞きましたが、NSInvocation を使用してコードを変換する方法がわかりません。誰かが私を助けることができますか?

よろしくお願いします、

4

1 に答える 1

0

あなたが抱えている可能性のある問題は、準備されたステートメントが無効になることsqlite3_closeです。データベースを開くたびに、新しい準備済みステートメントを作成する必要があります。

  1. でデータベースを開きますsqlite3_open
  2. sqlite3_prepareと友達と一緒に声明を準備します。
  3. でバインドしsqlite3_bindます。
  4. でステップしsqlite3_stepます。
  5. その後、必ず に電話してくださいsqlite3_finalize
  6. でデータベースを閉じますsqlite3_close

そのステートメントは別のデータベース ハンドル用に準備されているため、ステートメントをリセットすることはできません。

注意

私は SQLite にあまり詳しくありません。

于 2009-12-22T03:14:38.943 に答える