我可以成功更新我的sqlite数据库但是我希望主键对应于tableview中选择的行。我正在努力的原因是因为我需要从tableview获取indexpath并将其传递给我更新数据库的Todo类。这是代码:
Tableview(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)];
}
Todo课程:
- (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");
}
}
非常感谢!!!
答案 0 :(得分:0)
我必须从你的代码中假设每个todo都会获得相同的PK(indexPath.row)。
打破你的'performSelector'分开,并传递每个待办事项索引,如下:
for ( Todo *todo in appDelegate.todos ) {
[todo dehydrate:indexPath.row];
}
并重新声明脱水为:
- (void) dehydrate:(int) primaryKey { // use pk here ... }
答案 1 :(得分:0)
关于您的代码的一些评论:
dehydrate
方法会更好。关于您的问题:
如果indexPath行和pk之间没有对应关系,您的Cell应该托管主键/待办事项数据,以允许您“链接”它们。
如果您不想创建自己的单元子类,一个简单的方法就是使用cell tag
property