SQLite3 обновление не работает - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь выполнить команду обновления для моей таблицы sqlite3. Но это не работает:

+(void)updateContact:(Contact *)c withOriginalFirst:(NSString *)originalFirst originalLast:(NSString *)originalLast originalBriefDescription:(NSString *)originalBriefDescription {

    sqlite3 *database;
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {

        NSString *cmd = [NSString stringWithFormat:@"update contacts set first='%@', last='%@', briefDescription='%@' where first='%@' and last='%@' and briefDescription='%@';",
                         [c first],[c last],[c briefDescription],originalFirst,originalLast,originalBriefDescription];
        const char * sql = [cmd UTF8String];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sql, -1, &compiledStatement, NULL) == SQLITE_OK) {
            NSLog(@"updateContact SUCCESS - executed command %@",cmd);
        }
        else {
            NSLog(@"updateContact FAILED - failed to execute command %@",cmd);
        }

        sqlite3_finalize(compiledStatement);

    }
    else {
        NSLog(@"pdateContact FAILED - failed to open database");
    }

    sqlite3_close(database);

    NSLog(@"After update, contacts = %@",[SQLMaster getContactsFromDatabase]);

}

Я вижу напечатанное обновление updateContact SUCCESS - выполненная команда ... Но таблица не обновляется. Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Несколько вещей:

Куда указывает ваш путь базы данных?Убедитесь, что он указывает путь к документам в комплекте, а не внешнюю базу данных в проекте напрямую.Также убедитесь, что вы правильно указали оператор step.

+(void)updateContact:(Contact *)c withOriginalFirst:(NSString *)originalFirst originalLast:(NSString *)originalLast originalBriefDescription:(NSString *)originalBriefDescription {

sqlite3 *database;
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {

    NSString *cmd = [NSString stringWithFormat:@"update contacts set first='%@', last='%@', briefDescription='%@' where first='%@' and last='%@' and briefDescription='%@';",
                     [c first],[c last],[c briefDescription],originalFirst,originalLast,originalBriefDescription];
    const char * sql = [cmd UTF8String];
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sql, -1, &compiledStatement, NULL) == SQLITE_OK) {
        sqlite3_step(compiledStatement); // Here is the added step.
        NSLog(@"updateContact SUCCESS - executed command %@",cmd);
    }
    else {
        NSLog(@"updateContact FAILED - failed to execute command %@",cmd);
    }

    sqlite3_finalize(compiledStatement);

}
else {
    NSLog(@"pdateContact FAILED - failed to open database");
}

    sqlite3_close(database);
    NSLog(@"After update, contacts = %@",[SQLMaster getContactsFromDatabase]);

}

Кроме того, из строки [SQLMaster getContactsFromDatabase] я вижу, что вы вызываете другие методы базы данных.Убедитесь, что sqlite3_finalize достигается при всех этих вызовах базы данных, иначе база данных может не освободить занятый обработчик.

2 голосов
/ 28 августа 2012

это может вам помочь ...

  +(void)updateContact:(Contact *)c withOriginalFirst:(NSString *)originalFirst originalLast:(NSString *)originalLast originalBriefDescription:(NSString *)originalBriefDescription 

    {
    if(sqlite3_open([databasePath UTF8String],&myDatabase)==SQLITE_OK)
{
    sqlite3_stmt *compiledStmt;
    NSString  *sqlStmt=[NSString stringWithFormat:@"UPDATE contacts SET first =?, last =? , briefDescription =?, briefDescription =? WHERE first=?,last=?,briefDescription=?;"];

    if(sqlite3_prepare_v2(myDatabase, [sqlStmt UTF8String],-1,&compiledStmt, NULL)==SQLITE_OK)
    {

         NSLog(@"updateding......cycle");
    sqlite3_bind_text(compiledStmt,1, [[c first] UTF8String],-1,SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStmt,2, [[c last] UTF8String],-1,SQLITE_TRANSIENT);

     sqlite3_bind_text(compiledStmt,3, [[c briefDescription] UTF8String],-1,SQLITE_TRANSIENT);  

   sqlite3_bind_text(compiledStmt,4, [originalFirst UTF8String],-1,SQLITE_TRANSIENT);

   sqlite3_bind_text(compiledStmt,5, [originalLast UTF8String],-1,SQLITE_TRANSIENT);

    sqlite3_bind_text(compiledStmt,6, [originalBriefDescription UTF8String],-1,SQLITE_TRANSIENT);
    }
    sqlite3_step(compiledStmt);
    sqlite3_close(database);
}



  }
1 голос
/ 29 июня 2011

Вы подготовили заявление, но не выполнили его.Попробуйте int sqlite3_step (sqlite3_stmt *);после подготовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...