2

我正在尝试从 sqlite .data 中删除数据,我将从下到上删除数据,但随机删除数据从一行详细信息滑到另一行的数据,请帮助我删除数据。

这是我的代码

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;
}

表格视图.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它,就好像它是一个行号。它不是。它是唯一的行标识符,无论您添加还是删除其他行,对于给定行都不会更改。因此,如果您有五行(rowid从 1 到 5)并删除第一行,那么rowid后续四条记录的与rowid1) 的行。如果您有“随机”删除的记录,我想知道您是否row从您的数字中获取数字indexPath并假设该数字将对应于表rowid值,而在您从表中删除一条记录后它不会。

    您想要做的是,当您从数据库中读取数据时,也读取并保存相应的rowid(或者更好的是,如果您的表有主键,请使用它)。然后,当去删除一行时,你不应该只使用rowid等于你的indexPath.row,而是你应该抓住rowid你在开始时保存的与当前对应的唯一(或主键)indexPath.row来弄清楚如何删除有问题的行。

  2. 不相关,但您似乎不需要做任何sqlite3_bind. 您似乎没有任何需要绑定的参数。

  3. 也不相关,但是在你之后sqlite3_step,你又在做另一个sqlite3_prepare,这是没有意义的。如果sqlite3_step成功,您可以直接sqlite3_finalize退出。

  4. 顺便说一句,您可能需要考虑使用 Objective-C 包装器,例如出色的FMDB。它确实简化了 SQLite 编程过程。

于 2012-08-14T13:04:04.770 回答