从iphone中的sqlite和表视图中删除数据

时间:2012-08-14 11:13:38

标签: iphone ios sqlite

我正在尝试从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;
}

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

1 个答案:

答案 0 :(得分:0)

一些反应:

  1. 看起来您正在使用rowid,就好像它是一个行号。不是。无论您是添加还是删除其他行,它都是唯一的行标识符,对于给定的行不会更改。因此,如果您有五行(rowid从1到5运行),并删除第一行,则后续四条记录的rowid不会更改(它们将保持为2,删除rowid为1的行后删除3,4和5。如果你有“随机”删除的记录,我想知道你是否从你的row抓取indexPath号码,并假设它与表rowid值对应,它赢了在你从表中删除了一条记录之后。

    您要做的是,当您从数据库中读取数据时,也要读取并保存相应的rowid(或者更好,如果您的表有主键,请使用它)。然后,当您去删除一行时,您不应该只使用等于rowid的{​​{1}},而应该抓住您保存的唯一indexPath.row(或主键)在与当前rowid对应的开头,以确定如何删除相关行。

  2. 不相关,但似乎您不需要执行任何indexPath.row。您似乎没有任何需要绑定的参数。

  3. 也是无关的,但是在你的sqlite3_bind之后,你正在做另一个sqlite3_step,这是没有意义的。如果sqlite3_prepare成功,您只需sqlite3_step并退出。

  4. 顺便说一下,您可能想要使用Objective-C包装器,例如优秀的FMDB。它确实简化了SQLite编程过程。