Функция с аргументом для метода NSInvocation - PullRequest
0 голосов
/ 22 декабря 2009

У меня есть вид контроллера, который использует эти две функции:


[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, вот вторая функция в деталях:


- (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. Кто-нибудь может мне помочь?

С наилучшими пожеланиями,

1 Ответ

0 голосов
/ 22 декабря 2009

Проблема, с которой вы можете столкнуться, состоит в том, что ваше подготовленное утверждение недействительно после sqlite3_close.Вам нужно создавать новый подготовленный оператор каждый раз, когда вы открываете базу данных.

  1. Откройте базу данных с помощью sqlite3_open.
  2. Подготовьте оператор с помощью sqlite3_prepare и друзей.
  3. Связывание с sqlite3_bind.
  4. Шаг с sqlite3_step.
  5. После этого убедитесь, что вы звоните sqlite3_finalize.
  6. Закройте базу данных с помощью sqlite3_close.

Вы не можете просто сбросить оператор, потому что этот оператор был подготовлен для другого дескриптора базы данных.

NB

Я не слишком знаком сSQLite.

...