7

私は現在、Android上のSQLiteデータベースを操作するためにORMLiteを使用しています。この一環として、バックエンドサーバーから大量のデータをダウンロードしており、このデータをバックエンドサーバーとまったく同じ形式でSQLiteデータベースに追加したいと考えています(つまり、IDが同じであるなど)。 。

したがって、あなたへの私の質問は、setId()を介してEquipmentの生成されたId /主キーフィールドを含むデータベースエントリオブジェクト(これをEquipmentと呼びます)にデータを入力し、そのEquipmentエントリでDAO.create()を実行するかどうかです。そのIDは正しく保存されますか?私はそれをこのように試しましたが、そうではなかったようです。その場合は、もう一度試して他の問題を探しますが、最初の数回のパスでコードを見つけることができませんでした。したがって、基本的に、IDが設定されたデータベースオブジェクトでDAO.create()を呼び出すと、そのIDがデータベースに送信されます。そうでない場合は、主キー値がすでに入力されている行を挿入するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

14

@Femiは、オブジェクトが生成されたIDまたはIDのいずれかである可能性がありますが、両方ではないということは正しいです。問題は、ORMLiteがオブジェクトを格納する方法だけではありませんが、データベースが生成されたスキーマと一致する必要もあります。

ORMLiteは、この動作を可能にする注釈のallowGeneratedIdInsert=trueオプションをサポートしています。@DatabaseFieldこれは一部のデータベースタイプ(Derbyなど)ではサポートされていませんが、Android/SQLiteでは機能します。

後世のために、同じテーブルを共有する2つのオブジェクトを作成することもできます。1つは生成されたIDを使用し、もう1つは使用しません。次に、生成されたID Daoを使用して挿入し、その動作を取得し、他のDaoを使用して呼び出し元によって設定されたID値を取得できます。これについて話している別の答えがあります。あなたにとっての問題は、これが多くの余分なDAOを作成するように聞こえます。

他の唯一の解決策は、目的にIDを使用しないことです。データベースにIDを生成させてから、目的のために外部で設定された、使用する追加のフィールドを用意します。特定の状況でデータベースIDを強制することは、私には悪いパターンのようです。

于 2011-08-16T16:05:08.743 に答える
4

http://ormlite.com/docs/generated-idから:

フィールドが自動生成されたIDフィールドであるかどうかをブール値で指定します。デフォルトはfalseです。1つのクラスでこのセットを設定できるのは1つのフィールドのみです。これは、挿入されたすべての行に対応するIDを自動生成するようにデータベースに指示します。生成されたIDを持つオブジェクトがDao.create()メソッドを使用して作成されると、データベースは行のIDを生成します。この行は、createメソッドによってオブジェクトに返され設定されます。一部のデータベースでは、生成されたIDのシーケンスが必要です。その場合、シーケンス名は自動生成されます。シーケンスの名前を指定するには、generatedIdSequenceを使用します。this、id、およびgeneratedIdSequenceのいずれか1つのみを指定できます。

generatedId(この場合、すべてのIDを生成する必要があるように見えます)またはid(この場合、それらを設定できます)のいずれかを使用する必要がありますが、両方を使用することはできません。

于 2011-08-16T06:03:20.100 に答える