0

私はsqliteを初めて使用するので、しばらくお待ちください:)

sqlite db からデータを読み取る UITableView があります。レコードを削除すると、データベースの行が削除されます。問題は、他の行が主キーを保持していることです。たとえば、3 つの行があり、主キーは 1、2、4 です。キーを 1,2,3 に更新する可能性はありますか?

どうもありがとう!

編集:私はテーブルを作成します:

CREATE TABLE mytable (ID INTEGER PRIMARY KEY  AUTOINCREMENT, value1 TEXT);
4

1 に答える 1

1

REINDEXを使用します。 (REINDEX はインデックス構造を再構築するだけで、実際にはインデックスの値を変更しません。)

行の順序を暗黙的なインデックスとして使用する

行全体のインデックス値を変更しようとするのではなく、並べ替え順序のマッピングを実行してみませんか?

次のような SELECT ステートメントを使用します。

NSString* query = @"SELECT * FROM myTable ORDER BY id LIMIT 1 OFFSET %d";
query = [NSString stringWithFormat:query, indexPath.row + 1];

行を削除するには、次のようにします。

NSString* query = @"DELETE FROM myTable WHERE ID = (SELECT ID FROM myTable ORDER BY ID LIMIT 1 OFFSET %d)";
query = [NSString stringWithFormat:query, indexPath.row + 1];

INSERT するには、通常どおり通常の挿入を実行します。

この方法では、1 つの行を削除するときに、削除する行よりも大きい ID を持つすべての行を編集する必要がなくなります。これにより、はるかに高速になります。

テーブル ビューと DB の一貫性を保つために、DB で変更が発生するたびにテーブル ビューを更新してください。

これには、テーブル ビューの並べ替えを維持するという優れた副作用もあります。

影響を受けるインデックスを変更するトリガーを定義する

完全なシリーズになるようにインデックスを保持したい場合 (例: 1,2,3,4,...)

次のように削除トリガーを定義できます。

CREATE TRIGGER reindex AFTER DELETE ON myTable FOR EACH ROW
BEGIN
    UPDATE myTable SET ID = old.ID - 1 WHERE ID > old.ID;
END;
于 2009-11-24T18:12:54.633 に答える