0

テーブルビューを並べ替えようとしています - 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");
}


}
4

4 に答える 4

1

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];

}

働いているはずですが、

乾杯、

エディ

于 2015-04-20T11:40:23.433 に答える
0

float order_id を使用することをお勧めします。そして、ユーザーがアイテムを再注文すると、前後のアイテムの order_id を取得し、それらの平均 (float) を取得して DB に保存します。このように、再注文されたアイテムのみを更新する必要があります。

于 2014-01-17T18:48:16.163 に答える
0

tableView の numberOfRows がデータベースのエントリ数と一致しない場合が考えられます。たとえば、tableView の下部に「新しい行を追加...」セルがある場合、問題が発生する可能性があります。 、私が過去に持っていたように。私の問題は、tableView:moveRowAtIndexPath:toIndexPathが間違った値を返すことでしたsourceIndexPath。2 つの解決策は、どちらも問題を解決しました。最初の解決策: で呼び出す[tableview reloadData]tableView:moveRowAtIndexPath:toIndexPath:、行のアニメーションが失われる可能性がありますが、機能は維持され、sourceIndexPath/destinationIndexPath が更新されます。2 番目の解決策: 下部の [新しい行を追加...] セルを使用せず、追加する別の解決策を見つけます。幸運を!

于 2014-01-17T18:11:22.767 に答える