从表中删除行并更新sqlite数据库

时间:2012-12-02 17:43:33

标签: xcode sqlite uitableview tableview

我有一个基于tableview的应用程序。在详细信息视图中,有一个“保存到收藏夹”的选项。此选项获取项目并通过单击“收藏夹”按钮将其复制到名为“收藏夹”的视图控制器。

    sqlite3 *database;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];
NSString *nameOfItem = itemDetail.itemName;

if(sqlite3_open([dbPath UTF8String],&database)==SQLITE_OK)
{
    sqlite3_stmt *compiledStmt;

    NSString *sqlStmt=[NSString stringWithFormat:@"UPDATE items SET favorites='YES' WHERE item='%@'", nameOfItem];[paths objectAtIndex:0];

    if(sqlite3_prepare_v2(database, [sqlStmt UTF8String],-1,&compiledStmt, NULL)==SQLITE_OK)
    {
        NSLog(@"Successful update");
    }

    char* errmsg;
    sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

    sqlite3_step(compiledStmt);
    sqlite3_close(database);
}

}

这是按预期工作的。基本上,sqlite调用将列标志更新为yes,以便它显示在FavoritesViewController中。

我的问题出在FavoritesViewController中。我想选择从收藏夹中删除项目。我想我只是将sqlite查询从'YES'更改为'NO'。所以,我继续把查询放在:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{
if (editingStyle == UITableViewCellEditingStyleDelete) {
    if ([favoriteSchools count] >= 1) {
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [favoriteSchools removeObjectAtIndex:[indexPath row]];

        //
        sqlite3 *database;

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];
        NSString *nameOfItem = itemDetail.itemName;

        if(sqlite3_open([dbPath UTF8String],&database)==SQLITE_OK)
        {
            sqlite3_stmt *compiledStmt;

           NSString *sqlStmt=[NSString stringWithFormat:@"UPDATE items SET favorites='NO' WHERE item='%@'", nameOfItem]; [paths objectAtIndex:0];

            if(sqlite3_prepare_v2(database, [sqlStmt UTF8String],-1,&compiledStmt, NULL)==SQLITE_OK)
            {
                NSLog(@"Successful update");
            }

            char* errmsg;
            sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

            sqlite3_step(compiledStmt);
            sqlite3_close(database);

        [tableView endUpdates];

    }

}

显然,动画片段有效并将使用删除操作从视图中删除记录。但是,当我再次出门时,之前删除的项目再次出现。我通过用真实的项目名称替换'%@'来验证sqlite实际上正在做它应该做的事情。通过这样做,它相应地更新数据库,当外出和返回应用程序时,项目不会出现(当此视图打开时,有一个查询正在运行,以查找标志设置为yes的所有项目。)

我的问题......是否与正在定义的变量有关,或者它与不了解删除的实际行并将其与记录相关联有什么关系?

我感谢任何建议!

谢谢!

0 个答案:

没有答案