-1

データベースのエントリを更新すると、ステートメントが機能し、データベースでコードが更新されます。データベースが保存されていないにもかかわらず、アプリを閉じて再度開いた場合。一時データベースを作成し、アプリが読み取っているデータベースに実際に保存しないようです。

これが私のコードです:

-(void)updateDatabase:(int)Level andPlayer:(int)questionID{
    DataClass *obj=[DataClass getInstance];
    //NSFileManager *filemgr = [NSFileManager defaultManager];
    NSString* Database =[NSString stringWithFormat:@"levelProgress.db"];
    NSString* databaseP = [[[NSBundle          mainBundle]resourcePath]stringByAppendingPathComponent:Database];
databasePath = [[NSString alloc]initWithString:databaseP];

const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;

if (sqlite3_open(dbpath, &questionDB) == SQLITE_OK) {
    NSString *querySQL = [NSString stringWithFormat:@"UPDATE levelProgress SET completed_questions=completed_questions+1 WHERE level=%d", obj.levelSelected];
    const char *query_stmt = [querySQL UTF8String];
    sqlite3_prepare_v2(questionDB, query_stmt, -1, &statement, NULL);
    if(sqlite3_step(statement)==SQLITE_DONE){
        NSLog(@"update worked");
    }else{
        NSLog(@"did not work");
    }
    sqlite3_finalize(statement);
    sqlite3_close(questionDB);
    }
}

これについての助けをいただければ幸いです。

4

2 に答える 2

1

データベース ファイルdatabasePをアプリケーション バンドルからユーザー フォルダーにコピーし、それを更新します。アプリケーション バンドル内のファイルを更新することはできません (常に読み取り専用です)。

#define kDatabaseName (@"levelProgress.db")
- (void)checkAndCopyDatabaseIfNeeded
{
    if (!self.databasePath)
    {
        // Database should be present in user sandbox at root.
        self.databasePath = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], kDatabaseName, nil]];
    }

    // Check if the file already copied/exists.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL success = [fileManager fileExistsAtPath:self.databasePath];

    if(!success)
    {
        // Copy the file from app bundle to user sandbox (Files in app bundle can not be edited).

        NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:kDatabaseName];

#if DEBUG
        BOOL isCopied =
#endif
        [fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil];

        NSAssert(isCopied, @"Problem copying database file to user document folder");
    }
}
于 2013-10-24T01:35:09.697 に答える
0

データベースがバンドル内にある場合、読み取り専用です。データベースに書き込むときは、データベースをドキュメント ディレクトリに置く必要があります。

ここで受け入れられた回答を見てください: iOS での既存の SQLite データベースの使用とアクセス

于 2013-10-24T01:35:16.087 に答える