2

しばらくの間、これを理解しようとしていますが、解決策が見つからないようです。次のように作成されたテーブルがあります。

 [db executeUpdate:@"CREATE TABLE 'MEDIA' (identifier INTEGER PRIMARY KEY AUTOINCREMENT, taskIdentifier INTEGER, type INTEGER, data BLOB)"]

このテーブルにレコードを挿入するにはどうすればよいですか? 私はこれを試しました:

 [db executeUpdate:@"INSERT INTO 'MEDIA' VALUES($next_id,?,?,?)" withArgumentsInArray:arguments];

一方、arguments は 4 つの値を持つ NSArray であり、最初の値はダミー値 (それ自体を自動インクリメントする必要があるため) ですが、役に立ちません。これは FMDB でどのように動作するのでしょうか?

4

1 に答える 1

5

そこに AUTOINCREMENT キーワードが本当に必要かどうかを自問する必要があります。AUTOINCREMENT と INTEGER PRIMARY KEY を併用すると、ここで説明する非常に特殊な動作がもたらされます。必要ない可能性が非常に高く、その場合は、列定義に INTEGER PRIMARY KEY を残しておいてください。現在、INTEGER PRIMARY KEY として定義されている列は、実際には ROWID のエイリアスになるため、次の 2 つのオプションがあります。

  • INSERT ステートメントでこの列の値を省略します。これにより、次に利用可能な値が自動的に挿入されます。ドキュメントから: The usual algorithm is to give the newly created row a ROWID that is one larger than the largest ROWID in the table prior to the insert.したがって、INSERT は次のようになります:[db executeUpdate:@"INSERT INTO 'MEDIA' VALUES(?,?,?)" withArgumentsInArray:arguments];ただし、引数配列には、taskIdentifiertype、およびdataの 3 つの値のみが含まれます。

  • 次のように識別子列の値を指定します。インデックス 0のNSNumber[db executeUpdate:@"INSERT INTO 'MEDIA' VALUES(?,?,?,?)" withArgumentsInArray:arguments];として識別子を含む引数配列を使用します。

于 2012-05-30T11:59:13.043 に答える