3

モバイル プロジェクトに sqlite を使用していますが、長い ID 変数を主キーの自動インクリメントとして使用しようとすると、コードでエラー " Autoincrement is only allowed in integer primary key" が発生します。このエラーについてオンラインで確認したところ、sqlite の自動インクリメントはbigint型に対して許可されていないことがわかりました。

興味深いのはbigint、整数によっても実装されていることです-sqliteにはbigint型がありません-整数のサイズを使用して、それがaかどうかを判断するだけbigintです。 http://www.sqlite.org/datatype3.html

bigintこれを修正するために、テーブルを " "で作成するオープン ソース コードを " " に置き換え、integer通常の整数の境界外で動作することを確認するテスト コードを書きました (目的を達成し、さらに 10 個のオブジェクトを継続的に追加しました)。

現在は機能しているようですが、他の問題が発生する可能性があるかどうかを知りたいです。モバイル アプリ ID をデータベース ID に同期しているため、ID は通常の整数範囲より大きくなります。

このソリューションは有効なソリューションですか? これはどのようなトラブルを引き起こす可能性がありますか?

4

1 に答える 1

3

SQLiteバージョンのデータ型から:

宣言された型に文字列 "INT" が含まれている場合、INTEGER 親和性が割り当てられます。

ただし、これは、INTEGER アフィニティを持つ列が自動インクリメント デューティに適しているという意味ではありません。特殊なケースは、 ROWID とINTEGER PRIMARY KEYで明示的に描かれています。

.. PRIMARY KEY 列は、宣言された型名が正確に「INTEGER」である場合にのみ、整数の主キーになります。「INT」、「BIGINT」、「SHORT INTEGER」、「UNSIGNED INTEGER」などのその他の整数型名により、主キー列は行 ID のエイリアスとしてではなく、整数アフィニティと一意のインデックスを持つ通常のテーブル列として動作します。

SQLite のINTEGER 値の最大サイズは 8 バイト (64 ビット、符号付き 2 の補数) であるためlong、.NET (または Java) の値にきれいにマップされます。列が「INTEGER」として宣言されているかどうかは問題ではありません。これは、自動インクリメント列の場合、または「BIGINT」を使用する必要があります。(実際の型は、列ごとではなくごとです。ただし、自動インクリメント/ROWID 値はすべて整数になります。)

また、SQLite は、そのような列を明示的に作成しなくても、自動的に「レコード/行識別子」を持ちます。これは「ROWID」列であり、シャドウされていない限り、、、ROWIDまたは_ROWID_としてアクセスできます。これが適切なオプションである場合は、SQLite AutoincrementOIDを参照してください。アルゴリズムが変更され、単調に増加する保証が削除されます。

これらは、特定のアプリケーションでは重要な特性です。ただし、アプリケーションがこれらのプロパティを必要としない場合は、AUTOINCREMENT の使用には追加の作業が必要になるため、おそらくデフォルトの動作のままにする必要があります。

于 2014-06-07T08:34:41.680 に答える