1

次のようにテーブルのエントリを更新しようとしました:

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!されたので、すべてがそうであると想定しましたが、Mozilla Firefox の SQLite Manager 内のデータベースを確認すると、エントリが更新されません。何か不足していますか?助けてくれてありがとう

4

1 に答える 1

2

最初にデータベースをリソースからドキュメント ディレクトリにコピーします。

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

 }

リソースではなくdocumentdirに保存するデータベースを確認してください  

于 2012-03-19T09:45:26.473 に答える