如何将indexPath.row绑定到iphone sqlite中的主键

|| 我可以成功更新我的sqlite数据库,但是我希望主键与tableview中选择的行相对应。我之所以努力,是因为我需要从表视图中获取索引路径,并将其传递给更新数据库的Todo类。这是代码: 表格检视(RootViewController):
- (void)updateStatus:(id)sender { // called when a user presses the button to alter the status

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[sender superview]];
NSLog(@\"The row id is %d\",  indexPath.row); // This works

todoAppDelegate *appDelegate = (todoAppDelegate *)[[UIApplication sharedApplication] delegate];
Todo *td = [appDelegate.todos objectAtIndex:indexPath.row];

self.selectedIndexPath = indexPath;
NSLog(@\"Selected index path is %i\", self.selectedIndexPath); 

if (td.status == 0) {       
    [td updateStatus:1];
    NSLog(@\"Status is %i\",td.status);
}
else {
    [td updateStatus:0];
    NSLog(@\"Status is %i\",td.status);
}

[appDelegate.todos makeObjectsPerformSelector:@selector(dehydrate)];
} 
待办事项类:
- (void) dehydrate {
if (dirty) { // If the todo is “dirty” meaning the dirty property was set to YES, we will need to save the new data to the database.
if (dehydrate_statment == nil) {
    const char *sql = \"update todo set complete = ? where pk= ?\"; // PK needs to correspond to indexpath in RootViewController

    if (sqlite3_prepare_v2(database, sql, -1, &dehydrate_statment, NULL) != SQLITE_OK) {
        NSAssert1(0, @\"Error: failed to prepare statement with message \'%s\'.\", sqlite3_errmsg(database));
    }
}

sqlite3_bind_int(dehydrate_statment, 2, self.primaryKey);
sqlite3_bind_int(dehydrate_statment, 1, self.status);
int success = sqlite3_step(dehydrate_statment);

if (success != SQLITE_DONE) {
    NSAssert1(0, @\"Error: failed to save priority with message \'%s\'.\", sqlite3_errmsg(database));
}
sqlite3_reset(dehydrate_statment);
dirty = NO;
NSLog(@\"Dehydrate called\");
}       
}
非常感谢!!!     
已邀请:
我必须从您的代码中假设,每个待办事项都将获得相同的PK(indexPath.row)。 将您的“ performSelector”分开,并传递每个索引,如下所示:
  for ( Todo *todo in appDelegate.todos ) {
        [todo dehydrate:indexPath.row];
   }
并重新声明脱水为:
     - (void) dehydrate:(int) primaryKey {  // use pk here ... }
    
关于您的代码的一些说明: 代替使用AppDelegate承载全局数据,您应该使用单例类 使用[appDelegate.todos makeObjectsPerformSelector:@selector(dehydrate)];过于复杂地看着您想要做什么。以pk为目标的
dehydrate
方法会更好。 关于您的问题: 如果indexPath row和pk之间没有对应关系,您的单元应托管主键/待办事项数据,以允许您“链接”它们。 如果不想创建自己的单元格子类,一个简单的技巧是使用cell
tag
属性     

要回复问题请先登录注册