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”];
}
うーん、
レコード数が多くなった時にいちいち最大値を探してくるのは
ロスが大きい気がするのだけど。
この記事はお役に立ちましたか?