0

私は初心者です。この問題を抱えているのは私だけではないと思いましたが、私が見た他のすべての問題は、この特定の問題をカバーしていないようでした。sqlite でテーブルを更新しようとしています。以下のコードを参照してください。このコードは 5.1 と 6.1 の両方のシミュレーターで動作しますが、自分のデバイス (iPhone 4 - iOS 6.1) で実行すると、" sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);" ステートメント (下から 5 番目のステートメント) がエラー "if" ステートメント (下から 4 番目のステートメント) で失敗します。そして、「更新中にエラーが発生しました。コミットできません - トランザクションがアクティブではありません」という NLog ステートメント (下から 3 番目のステートメント) が表示されます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    int rowCount = indexPath.row;
    Game *game = [self.thegames objectAtIndex:rowCount];
    cell.textLabel.text = game.GameDate;


    NSString* str3=[game.GameDate substringToIndex:4];

    NSString * Selected = [NSString stringWithFormat:@"%@%@", @"You Selected Game - ", str3];
    displayLabel.text = Selected;


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"sportretortdatab2.sqlite"];

    NSString* str1 = displayLabel.text;
    NSString *str2 = [str1 substringFromIndex: [str1 length] - 4];

    sqlite3 *database;
    sqlite3_stmt *updateStmt;
           if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK)    
    {
        NSString* sql= [NSString stringWithFormat:@"UPDATE ArchievedGameDate Set GameDate = \"%@\"", str2];


        if(sqlite3_prepare(db, [sql cStringUsingEncoding:NSASCIIStringEncoding], -1, &updateStmt, NULL) != SQLITE_OK)
            NSLog(@"Error while creating update statement. %s", sqlite3_errmsg(database));
    }
    char* errmsg;
    sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

    if(SQLITE_DONE != sqlite3_step(updateStmt))
        NSLog(@"Error while updating. %s", sqlite3_errmsg(database));
    sqlite3_finalize(updateStmt);
    sqlite3_close(database);
    }
4

1 に答える 1

0

私は試してみます:

if(sqlite3_step(updateStmt) != SQLITE_DONE)

また

int step = sqlite3_step(updateStmt);
if(step != SQLITE_DONE)

なし:

sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

これはこの文脈で本当に必要ですか?取引を開始しましたか?sqlite は自動コミット モードになっていると思いますが、sqlite3_get_autocommit() インターフェイスで確認できます。指定されたデータベース接続が自動コミット モードであるかどうかにかかわらず、それぞれ非ゼロまたはゼロを返します。自動コミット モードはデフォルトでオンになっています。自動コミット モードは、BEGIN ステートメントによって無効にされます。自動コミット モードは、COMMIT または ROLLBACK によって再度有効になります。

すべての SQLite 関数をステートメントに入れます。

if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK)

また、この準備の最初のパラメーターの「db」がアクティブなコードの「データベース」であることを願っています。これは、2 つのデータベース インスタンスで作業していることを意味するためです。

sqlite3_prepare(db, [sql cStringUsingEncoding:NSASCIIStringEncoding], -1, &updateStmt, NULL) != SQLITE_OK)

それがあなたの問題を解決することを願っています。

于 2013-02-17T09:34:28.453 に答える