ios - 重新排序 uitableview 中的项目并将更改应用于 sqlite 数据库

标签 ios sql objective-c sqlite

我正在尝试重新排序 TableView - 设置了 canMoveRowAtIndexPath 和 moveRowAtIndexPath ,以便我可以在编辑模式下拖动单元格,但我需要基本上将这些更改镜像到我的 sqlite 数据库中有。我有一个名为“orderid”的列,我用它来跟踪单元格的顺序。我的方法基本上是将要移动的单元格设置为 orderid=9999,然后从其余受影响单元格的 orderid 中添加或减去 1,然后将新单元格设置为其目标 orderid。我认为这可能是一个sql错误,但我无法弄清楚。如果有人有任何建议,我们将不胜感激。

这些是我的方法:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{

long source = (long)sourceIndexPath.row;
long dest = (long)destinationIndexPath.row;

source++;
dest++;

//reorder in db
NSString *sql;
if (source>dest) {
    sql = [NSString stringWithFormat:@"UPDATE entries SET orderid=9999 where orderid=%ld; update entries set orderid = orderid + 1 where orderid<%ld AND orderid>=%ld update entries set orderid=%ld where orderid=9999", source, source,dest, dest];
} else if (source<dest){
    sql = [NSString stringWithFormat:@"UPDATE entries SET orderid=9999 where orderid=%ld; update entries set orderid = orderid - 1 where orderid BETWEEN orderid>%ld AND orderid<=%ld; update entries set orderid=%ld where orderid=9999", source, source, dest, dest];
}

NSLog(@"%@", sql);

char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) !=SQLITE_OK) {
    sqlite3_close(db);
    NSLog(@"could not reorder");
} else {
    NSLog(@"rows reordered");
}


}

最佳答案

我正在使用 pageOrder 在我的页面表中创建一个订单。这是表格:

.s pages
CREATE TABLE pages (              
uuid INTEGER PRIMARY KEY,              
name TEXT,              
pageOrder INTEGER DEFAULT 0              
);

代码如下:

int fromRow = [sourceIndexPath row];
int toRow = [destinationIndexPath row];

if (toRow != fromRow) {

  FMDatabase* db = [FMDatabase databaseWithPath:[appDelegate dbPath]];
  [db open];

  [db executeUpdate:@"UPDATE pages SET pageOrder = -? WHERE pageOrder = ?",
   [NSNumber numberWithInt:toRow + 1],
   [NSNumber numberWithInt:fromRow + 1]];

  if (toRow < fromRow) {

    [db executeUpdate:@"UPDATE pages SET pageOrder = pageOrder + 1 WHERE pageOrder > ? AND pageOrder <= ?",
     [NSNumber numberWithInt:toRow],
     [NSNumber numberWithInt:fromRow]];


  } else {

    [db executeUpdate:@"UPDATE pages SET pageOrder = pageOrder - 1 WHERE pageOrder > ? AND pageOrder <= ?",
     [NSNumber numberWithInt:fromRow],
     [NSNumber numberWithInt:toRow + 1]];

  }

  [db executeUpdate:@"UPDATE pages SET pageOrder = abs(pageOrder) WHERE pageOrder < 0"];

  [db close];

}

应该可以,

干杯,

涡流

关于ios - 重新排序 uitableview 中的项目并将更改应用于 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19847408/

相关文章:

mysql - 在数据库中使用循环 FK 引用

java - Java 中的多个 SQL 语句(使用 ?allowMultiQueries=true)

ios - Xcode 5 中的 NSArray 初始化

objective-c - 在 iOS 版 Google Analytics 2 中跟踪事件的正确方法是什么

ios - 应用程序在后台运行一段时间后,Firebase 存储下载任务未完成

ios - 我怎样才能在一个额外的功能中外包这种重复的代码味道? iOS Swift 函数

iphone - iOS:如何获取未处理的 std::exception 的堆栈跟踪?

ios - 解析具有特定条件的字符串

sql - 先进先出 (FIFO) 库存成本核算

ios - 从电话号码中查找国家代码