0

私はこれを何日も理解しようとしていますが、何が起こっているのかわかりません。私のアプリでは、アイテムと関連アイテムをtableViewから削除できるようにしたいと考えています。したがって、TableView の削除ボタンが押されると、次のメソッドが呼び出されます。

- (BOOL) deleteDuik:(MOODuik *) duik
{
    int diveid = [duik duikId];
    NSLog(@"Begin Delete");
    sqlite3 *db = [self openDatabase];

    sqlite3_stmt * deleteStmt = nil;


    BOOL succes = TRUE;

    @try{
        if (db != NULL) {
            sqlite3_exec(db, "BEGIN TRANSACTION", 0, 0, 0);

            //NSString *sqlString = [NSString stringWithFormat:@"delete from duik where duikid = %d", diveid];

            const char *sql = "delete from duik where duikid = ?";
            if(sqlite3_prepare_v2(db, sql, -1, &deleteStmt, NULL) == SQLITE_OK)
            {

                sqlite3_bind_int(deleteStmt, 1, diveid);

                sqlite3_step(deleteStmt);
                sqlite3_finalize(deleteStmt);

                deleteStmt = nil;

                sql = "delete from waarneming where duikid = ?";

                if(sqlite3_prepare_v2(db, sql, -1, &deleteStmt, NULL) == SQLITE_OK)
                {
                    sqlite3_bind_int(deleteStmt, 1, diveid);

                    sqlite3_step(deleteStmt);
                    sqlite3_finalize(deleteStmt);
                }

            }

        } else
        {
            NSLog(@"Failed to connect to db");
            succes = FALSE;
        }

        if(succes && ( [duik backendid] == 0 ||  [self deleteDuikServerSide:[duik backendid]]))
        {
            NSLog(@"End Delete");
            if(sqlite3_exec(db, "COMMIT TRANSACTION", 0, 0, 0) !=SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
        } else{
            NSLog(@"Failed to delete remote copy");
            sqlite3_exec(db, "ROLLBACK TRANSACTION", 0, 0, 0);
            succes = false;
        }

    } @catch (NSException *e) {
        NSLog(@"Failed to delete: %@", [e description]);
        sqlite3_exec(db, "ROLLBACK TRANSACTION", 0, 0, 0);
    } @finally {

        @try {
            sqlite3_finalize(deleteStmt);
            sqlite3_close(db);

        }
        @catch (NSException *exception) {
            //REally nothing to do here
        }
        sqlite3_close(db);
    }

    return succes;
}

これを実行しようとすると、データベースがロックされていると表示され続けますが、なぜロックされているのかわかりません。他のアクションが同時に DB を必要とするかどうかを確認しましたが、何も見つかりません。また、同じ tableView から行を追加すると、トランザクションで同じ構造を使用し、それが機能します。私は思いついたすべてを試し、このコードのチャンクを少なくとも 10 回書き直しましたが、今のところうまくいきません。

ここで私が間違っていることを教えてくれる人はいますか?

4

0 に答える 0