2

sqlite .data からデータを削除しようとしています。下から上に削除しますが、データをランダムに削除すると、データが 1 つの行の詳細から別の行にスワイプされました。データを削除するのを手伝ってください。

これは私のコードです

appdelegate.m

-(void)deleteData:(NSString *)str:(NSString *)string
{   
    NSLog(@"intIndexpath:--> %d",intIndexpath);

    [self createEditableCopyOfDatabaseIfNeeded];

    sqlite3_stmt *deleteStatement = nil;

    NSString *sql;

    int returnvalue;

    sql = [NSString stringWithFormat:@"DELETE FROM UserInfo_1 WHERE rowid=%d",intIndexpath+1];

    returnvalue = sqlite3_prepare_v2(database, [sql UTF8String], -1, &deleteStatement, NULL);

    if (returnvalue == 1)
    {
        NSAssert1 (0,@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(deleteStatement, 1,[strAcountName UTF8String], -1, SQLITE_TRANSIENT);

    if (SQLITE_DONE!= sqlite3_step(deleteStatement))
    {
        NSAssert1(0, @"Error while deleteing data. '%s'", sqlite3_errmsg(database));
    }

    if (sqlite3_prepare(database, [sql UTF8String], -1, &deleteStatement, NULL) == SQLITE_OK) 
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Delete" message:@"Record Deleted" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
        [alert show];
        [alert release];

        alert=nil;

    }
    else
        sqlite3_reset(deleteStatement);

    sqlite3_finalize(deleteStatement);
    deleteStatement = NULL;
}

tableview.m

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        apd.intIndexpath = indexPath.row;

        [apd deleteData:[apd.ArrAcName objectAtIndex:indexPath.row] :apd.strAcountName];
        [apd.ArrAcName removeObjectAtIndex:indexPath.row];

        apd =(PasswordAppDelegate *)[[UIApplication sharedApplication]delegate];

//        NSLog(@"apd.strAcountName is:--> %@",apd.strAcountName);

        // [apd deleteData:apd.strAcountName];

        self.navigationItem.title =@"Details";

        [tableView reloadData];
    }
}
4

1 に答える 1

0

いくつかの反応:

  1. rowid行番号のように使用しているようです。そうではありません。これは、他の行を追加または削除するかどうかに関係なく、特定の行に対して変更されない一意の行識別子です。したがって、5 つの行 ( rowid1 から 5 まで実行) があり、最初の行を削除したrowid場合、後続の 4 つのレコードの は変更されません (削除後も 2、3、4、5 のままです1 rowid) の レコードを「ランダムに」削除している場合、テーブルから 1 つのレコードを削除した後ではなく、テーブルの値に対応すると仮定して、row番号を取得しているかどうか疑問に思っています。indexPathrowid

    やりたいことは、データベースからデータを読み取るときに、それぞれの も読み取って保存することですrowid(または、テーブルに主キーがある場合はそれを使用することをお勧めします)。次に、行を削除するときは、にrowid等しいを使用するだけindexPath.rowでなく、現在のに対応する最初に保存した一意のrowid(または主キー)を取得して、indexPath.rowを削除する方法を理解する必要があります問題の行。

  2. 無関係ですが、何もする必要はないようですsqlite3_bind。バインドが必要なパラメーターがないようです。

  3. これも無関係ですが、あなたの の後、意味をなさないsqlite3_step別の を行っています。成功したsqlite3_prepare場合は、そのまま終了できます。sqlite3_stepsqlite3_finalize

  4. 余談ですが、優れたFMDBなどの Objective-C ラッパーの使用を検討することをお勧めします。これにより、SQLite プログラミング プロセスが大幅に簡素化されます。

于 2012-08-14T13:04:04.770 に答える