我正在尝试从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];
}
}
答案 0 :(得分:0)
一些反应:
看起来您正在使用rowid
,就好像它是一个行号。不是。无论您是添加还是删除其他行,它都是唯一的行标识符,对于给定的行不会更改。因此,如果您有五行(rowid
从1到5运行),并删除第一行,则后续四条记录的rowid
不会更改(它们将保持为2,删除rowid
为1的行后删除3,4和5。如果你有“随机”删除的记录,我想知道你是否从你的row
抓取indexPath
号码,并假设它与表rowid
值对应,它赢了在你从表中删除了一条记录之后。
您要做的是,当您从数据库中读取数据时,也要读取并保存相应的rowid
(或者更好,如果您的表有主键,请使用它)。然后,当您去删除一行时,您不应该只使用等于rowid
的{{1}},而应该抓住您保存的唯一indexPath.row
(或主键)在与当前rowid
对应的开头,以确定如何删除相关行。
不相关,但似乎您不需要执行任何indexPath.row
。您似乎没有任何需要绑定的参数。
也是无关的,但是在你的sqlite3_bind
之后,你正在做另一个sqlite3_step
,这是没有意义的。如果sqlite3_prepare
成功,您只需sqlite3_step
并退出。
顺便说一下,您可能想要使用Objective-C包装器,例如优秀的FMDB。它确实简化了SQLite编程过程。