5

わかりました、SQLiteinsert ステートメントが というものを返すことがわかりますrow id

SQLite挿入時には、 が ID という主キー列を好み、挿入される ID 値が null の場合に適切な値を自動生成することがわかっています。

欠けている接着剤はrow id、メソッドによって返されたSQLiteDatabase.insert()が実際に行の主キーに対して自動生成された値であることの確認です。(これはOracleには当てはまりません...)

誰か肯定か否定してくれませんか?

解像度

わかりました、@sixfeetsix によって投稿されたリンクから:

SQLite テーブルの各エントリには、「rowid」と呼ばれる一意の 64 ビット符号付き整数キーがあります。行 ID は、宣言されていない列として常に使用できます... テーブルに INTEGER PRIMARY KEY 型の列がある場合、その列は行 ID の別のエイリアスです。

次に、彼のauto-incrementリンクは、row_idと自動インクリメント値が同じ値になることを確認します。

以上で終わりです。ありがとうございます。

4

2 に答える 2

4

Androidのinsert(...) メソッドは次を返します。

新しく挿入された行の行 ID、またはエラーが発生した場合は -1

これは初心者にとっては混乱を招く可能性がありますが、sqlite の行 IDはフィールドであるか、integer primary keyフィールドがない場合は ROWID という名前の 64 ビットの宣言されていない列です。

そのため、自動インクリメント フィールドにNULL を挿入するか値を挿入しないと、生成された値が返されます。

于 2012-04-28T13:47:08.363 に答える
2

それらは2つの別個のものです。

によって返される row_id はinsert()、挿入された行の一意の識別子であり、SQLite によって内部的に使用される識別子です。

一方、次のように宣言された、ビジネスのキーを表すテーブル内の列を持つことができます。

_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT

そのため、SQLite はその列の値を生成します。

私の知る限り、SQLite には SQL Server の SCOPE_IDENTITY() のような関数はありません (最後に挿入された自動インクリメンタル ID を返します)。

したがって、挿入を行い、自動生成された ID を取得する必要がある場合は、次のようにすることができます。

SELECT seq FROM sqlite_sequence WHERE name='tableName'

ただし、これは並行シナリオでは安全な方法ではないことに注意してください。

于 2012-04-28T13:49:14.037 に答える