Моя инструкция по обновлению не работает - PullRequest
1 голос
/ 19 марта 2012

Я попытался обновить запись в своей таблице следующим образом:

NSFileManager *fileMgr=[NSFileManager defaultManager];
        NSString *dbPath=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"quizDB.sqlite"];

        if ([fileMgr fileExistsAtPath:dbPath]) {
            NSLog(@"DB does exist!");//displayed
        }
        const char *dbpath = [dbPath UTF8String];
        sqlite3_stmt    *updateStmt;
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
        {
            NSLog(@"%i",id_quiz);//displayed, in a test case it display 1 which is a quiz ID in the table
            NSString *querySql=[NSString stringWithFormat:@"Update quiz set etat=1 where id=\"%i\"",id_quiz]; 
            const char*sql=[querySql UTF8String];

            sqlite3_prepare_v2(contactDB, sql, -1, &updateStmt, NULL);

                if(SQLITE_DONE != sqlite3_step(updateStmt))
                { 
                    NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(contactDB));
                }
                else{ 

                    sqlite3_reset(updateStmt);
                    NSLog(@"Update done successfully!");//this is also displayed, i guess everything is ok then and the entry is updated
                }

            sqlite3_finalize(updateStmt);           
            sqlite3_close(contactDB);
        }

В журнале я получил сообщение: Update done successfully!, поэтому я предположил, что все так, однако, когда я проверяю базу данных вSQLite Manager в Mozilla Firefox, запись не обновляется.Я что-то пропустил?Спасибо за помощь

1 Ответ

2 голосов
/ 19 марта 2012

сначала скопируйте базу данных из ресурса в каталог dir:

- (void) checkAndCreateDatabase
{
NSString *database_Name =@"quizDB.sqlite"
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *database_Path = [documentsDir stringByAppendingPathComponent:database_Name];

NSFileManager *fileManager = [NSFileManager defaultManager];

if(![fileManager fileExistsAtPath:database_Path])
{
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_Name];

    [fileManager removeItemAtPath:database_Path error:nil];
    [fileManager copyItemAtPath:databasePathFromApp toPath:database_Path error:nil];
}
else
{
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_Name];
    [fileManager copyItemAtPath:databasePathFromApp toPath:database_Path error:nil];
}

 }

, а после обновления базы данных:

 - (void) UpdateDatabase
{       
sqlite3 *contactDB;
sqlite3_stmt *updateStmt;
NSString *database_Name =@"quizDB.sqlite"

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *dbpath = [documentsDir stringByAppendingPathComponent:database_Name];

if(sqlite3_open([dbpath UTF8String], &contactDB) == SQLITE_OK)
  {
  NSString *querySql=[NSString stringWithFormat:@"Update quiz set etat=1 where id=\"%i\"",id_quiz];
  const char*sql=[querySql UTF8String];
    if(sqlite3_prepare_v2(contactDB,sql, -1, &updateStmt, NULL) == SQLITE_OK)
    {
        if(SQLITE_DONE != sqlite3_step(updateStmt))
            {
                    NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(contactDB));
            }
            else{
                sqlite3_reset(updateStmt);
                NSLog(@"Update done successfully!");
                }
      }



    sqlite3_finalize(updateStmt);
}
sqlite3_close(contactDB);

 }

и проверьте свою базу данных, которая сохраняется в каталоге документов, а не в ресурсе

...