Objective-CのSQLiteライブラリFMDBで、executeQueryを使ってINSERT時にAUTOINCREMENTされたキーの最大値を取得する

 

Objective-CのSQLiteライブラリFMDBで、
AUTOINCREMENTするキーを持つテーブルを作成しました。

INSERT時に、AUTOINCREMENTを指定したカラム以外に値を指定すれば
AUTOINCREMENTのカラムには自動で最大値が入るのですが、
さて、その、最後にINSERTされたレコードの値を取得したい時はどうしたら良いのでしょう。

MySQLなら  last_insert_id() で最後のプライマリキーが取れるようです。

そしてSQLiteにも似たような関数、
LAST_INSERT_ROWID() というのがあります。

しかし少し都合が違うようです。

LAST_INSERT_ROWID() は、
カラムに存在するAUTOINCREMENTされた値ではなく、
SQLiteが勝手に裁判しているROWIDというもののの最大値を返すようです。
ROWIDについて:http://www.dbonline.jp/sqlite/table/index8.html

しかも、テーブル横断的になってしまうとか。

http://d.hatena.ne.jp/tociyuki/20101202/1291295007
ただし、sqlite3 の last_insert_rowid() はテーブルを問わず、
最後に挿入した行の rowid を返す欠点があります。

そこで、取得すべきテーブルの取得すべきカラムの最大値を取得する
という方法で凌ぐことにしました。

FMDatabase* db = [FMDatabase databaseWithPath:@"DBのPath"];
sql = @”select MAX(COLUMN_X) as MAX_KEY_VALUE from TABLE”;
NSMutableArray* results = [[NSMutableArray alloc] init];

[db open];
FMResultSet* rs = [db executeQuery:sql];
while ([rs next]) {
[results addObject:[rs resultDictionary]];
}
[db close];

NSString* maxKeyValue = @”0″;
if([resutls count]>0){
maxKeyValue = [[resultArr objectAtIndex:0] objectForKey:@”MAX_KEY_VALUE”];
}

うーん、
レコード数が多くなった時にいちいち最大値を探してくるのは
ロスが大きい気がするのだけど。

この記事はお役に立ちましたか?


コメント

コメントする