首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从表视图中删除行,从sqlite数据库中删除记录

从表视图中删除行,从sqlite数据库中删除记录
EN

Stack Overflow用户
提问于 2012-01-23 13:28:55
回答 2查看 3.4K关注 0票数 2

我使用以下语句创建了sqlite表:

代码语言:javascript
复制
"CREATE TABLE IF NOT EXISTS reminders (ID INTEGER PRIMARY KEY,Name VARCHAR(64), Event VARCHAR(64), Date VARCHAR(64), Bfr VARCHAR(64), Val VARCHAR(64),Num VARCHAR(64), Bod VARCHAR(400) ,Grp VARCHAR(64))";

我已经成功地插入数据和检索数据从sqlite数据库,并显示提醒在视图提醒太编程!

但我对删除sqlite数据库中的记录感到震惊,我的意思是我使用了一个模型类来保存诸如名称、事件、日期etc...In添加提醒页面等值,我为模型类中声明的变量分配了值,即

textField.text = remClass.Name等。

我的描述听起来可能令人困惑,但上述信息对于轻松回答这个问题总是有用的。

我添加了提醒页,用户输入数据并单击“保存”,然后将数据插入到database.There is View提醒页中,在该页面中,用户可以查看保存的reminder.In,有三种不同的方式查看提醒:viewAll、viewMonthly、viewGroup.Now in view --我使用以下语句为每个提醒显示唯一的ID:

代码语言:javascript
复制
ReminderClass *loadedReminder = [[ReminderClass alloc] init];

loadedReminder.reminderID = sqlite3_column_int(statement, 0); 

其中,提醒类是一个模型类,它保存在add提醒页中输入的所有值。

为了显示保存的提醒,我使用了一个数组,并在检索每一行,即id、名称、事件、日期等之后,添加了模型类对象。并填充了表视图accordingly.Say,如果我保存了3条提醒,那么部分就像wise之类的.

现在,如果我单击视图组提醒页中的编辑按钮,那么我们就可以通过单击左侧的方位按钮来删除表视图的行(部分)。

如果我删除了该行,比如一个带有reminder.Then的行--对应于该提醒的数据也应该从sqlite数据库中删除。

我如何做到这一点,我已经通过了这个link听起来类似于我的requirement.But,它不起作用。

最后,我实现了以下删除代码:

代码语言:javascript
复制
if (editingStyle == UITableViewCellEditingStyleDelete) 
    {        
        [self.grpArray objectAtIndex:indexPath.section];

        if(sqlite3_open([databasePath UTF8String], &remindersDB)==SQLITE_OK)
        {   
            sqlite3_stmt *compiledstatement;

            int pk = sqlite3_column_int(compiledstatement, 0);
            NSString *querySQL = [NSString stringWithFormat:@"delete from reminders where ID = %i",pk];

            const char *sqlstmt=[querySQL UTF8String];

            if(sqlite3_prepare_v2(remindersDB, sqlstmt, -1, &compiledstatement, NULL)==SQLITE_OK)
            {                
                if(SQLITE_DONE != sqlite3_step(compiledstatement))

                    NSAssert1(0,@"Error while creating delete statement => %s",sqlite3_errmsg(remindersDB));
            }
            NSLog(@"delete DONE");
            sqlite3_finalize(compiledstatement);
        }
        sqlite3_close(remindersDB);

        [self.gTable reloadData];
    }

检索代码:

代码语言:javascript
复制
-(void)loadgReminders
{

    EventsReminderAppDelegate *appDelegate = (EventsReminderAppDelegate *)[[UIApplication sharedApplication]delegate];
    NSLog(@"String = %@",appDelegate.groupString);

    self.grpArray = nil;
    self.grpArray = [[NSMutableArray alloc]init];

    //Retrieve the group of reminder
    const char *thePath = [self.databasePath UTF8String];
    sqlite3_stmt *statment;

    if (sqlite3_open(thePath, &remindersDB) == SQLITE_OK)
    {
        NSString *getQuery = [NSString stringWithFormat:@"SELECT * FROM reminders WHERE Grp = '%@' ORDER BY Date ASC",appDelegate.groupString];
        const char *sqlite_stmt = [getQuery UTF8String];

        if (sqlite3_prepare_v2(self.remindersDB, sqlite_stmt, -1, &statment, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statment) == SQLITE_ROW) 
            {
                ReminderClass *remind = [[ReminderClass alloc]init];
                remind.reminderID = sqlite3_column_int(statment, 0);
                **NSLog(@"reminderID=%d",remind.reminderID);**
                remind.Name = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 1)];
                remind.Event = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 2)];
                remind.Date = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 3)];
                remind.numDays = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 4)];
                remind.selString = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 5)];
                remind.number = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 6)];
                remind.msgBody = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 7)];
                remind.remGroup = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 8)];

                NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease];
                [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSDate *date = [dateFormat dateFromString:remind.Date];
                [dateFormat setDateFormat:@"MMMM dd"];
                NSString *dateVal = [dateFormat stringFromDate:date];
                remind.Date = dateVal;

                [self.grpArray addObject:remind];

                [remind release];
            }

            sqlite3_finalize(statment);
        }

        sqlite3_close(remindersDB);
    }
}

在这里,我使用NSLog检查是否正确显示了提醒ID值,它显示如下:

但是,当我尝试对删除进行同样的操作以检索id值并将该id值分配到哪个id=时,会有什么问题呢?

不管用,我哪里错了?

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-23 13:49:01

你可以这样做。这肯定会解决的

代码语言:javascript
复制
if (editingStyle == UITableViewCellEditingStyleDelete) 
        {

            NSString *dbPath = [self getDBPath];

            NSString *couponIdValue = [listOfCouponId objectAtIndex:indexPath.row];


            if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

                const char *sql = "delete from reminders where ID = ?";
                sqlite3_stmt *deletestmt;
                if(sqlite3_prepare_v2(database, sql, -1, &deletestmt, NULL) != SQLITE_OK) {
                    NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
                }



                sqlite3_bind_int(deletestmt, 1, [IdValue intValue]);


                if (SQLITE_DONE != sqlite3_step(deletestmt)) 
                    NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));


                sqlite3_reset(deletestmt);

}

在sqlite3_bind_int()方法中传递id的值。

票数 1
EN

Stack Overflow用户

发布于 2012-01-23 13:38:26

编辑:

在阅读注释之后,您似乎遇到了将内存中的提醒( id )与要删除的数据库中的id对齐的问题。数组索引不一定对应。当您用insert语句创建提醒时,您必须立即跟随该调用,调用sqlite3_last_insert_rowid,因为它是生成的。然后将模型类reminderId分配给它。然后在delete中,只需阅读reminderId来组成delete语句。再一次,请记录每件事。

http://www.sqlite.org/capi3ref.html#sqlite3_last_insert_rowid

插入后,如果选择了提醒列表,请确保选择id列并将其分配给模型reminderId,以便知道要删除什么。在insert和select两种情况下,您都需要确保最终得到等于从db生成的id的模型reminderId。

初步:

从代码中可以看出,您使用的是一个编译语句(这很好),这意味着您调用、准备和保存编译语句以进行重用。如果您正在重复使用(无法查看所有代码),请确保在它上调用sqlite3_reset。而且,如果你是重复使用,你不应该完成它,直到你完全完成它。

如果这不是问题所在,那么从注销pk和复合sql语句开始。确保这是你所期望的。例如,如果它是0,并且您说删除其中pk =0,那么它不会失败-它只是不会做任何事情,因为没有一个id为0的行(从1开始)。

然后,从sqlite3命令行尝试相同的语句。您可以注销模拟器正在使用的路径。

另外,注销返回代码(只是不要检查SQLITE_DONE。除了错误消息之外,我还提供了提示。

希望其中之一能让你朝着正确的方向前进。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8972378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档