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 看起来像这样:但参数数组将只包含taskIdentifiertypedata[db executeUpdate:@"INSERT INTO 'MEDIA' VALUES(?,?,?)" withArgumentsInArray:arguments];的 3 个值。

  • 像这样为标识符列提供值:[db executeUpdate:@"INSERT INTO 'MEDIA' VALUES(?,?,?,?)" withArgumentsInArray:arguments];使用包含标识符的参数数组作为索引 0 上的NSNumber

于 2012-05-30T11:59:13.043 回答