결론부터 말하면 그러하다. 자세한건 아래를 참고.
https://www.sqlite.org/c3ref/last_insert_rowid.html
상황 설명을 하자면 이러하다.
1. 안드로이드에서 SQLite 를 쓰는데,
2. insert 를 한 후에 last inserted id 가 필요했다. 많이 있는 패턴이잖아?
3. 그런데, sqlite 는 lastInsertedID() 가 없...어서 만들어서 써야됨.
그런데, lastInsertedID() 를 뒤져보다 보니, sqlite 소스에서, db.insert() 후의 리턴값을 바로 lastInsertedID() 처럼 사용하는 코드를 봤다. 예를 들면 이런식.
public int DBLayerFoo1()
{
....
return db.insert();
....
}
public int parentFoo()
{
...
int idx = DBLayerFoo1();
String query = " select * from tablename where idx=" + idx;
...
}
문법을 개의치 말고 보자. 대충 쓴 거다.
코드에서 보면, 별도의 함수 없이 insert() 후에 return 값을 idx 라고 "간주" 하고, 다음 sql 문장에 그대로 이용한다.
이게 가능한건가?
결론부터 말하면 가능하다. insert() 의 반환값이 lastInsertedID() 와 같다는 게 이런 뜻이다.
저게 가능한 까닭이 위의 링크에 쓰여 있는데,
원래 sqlite 의 insert() 함수는 리턴값으로 row id 를 반환한단다.
이 row id 란 놈은 원래 sqlite 에 고유하게 존재하는 값으로,
1. 생성되는 모든 테이블에,
2. 사용자가 명시적으로 설정하지 않아도 추가되어서
3. insert() 가 실패하면 -1 반환
4. insert() 가 성공하면 1 이상의 값을 반환 ( 0 은 반환하지 않는다 )
한다. 일종의 "테이블의 row 각각을 구별하는 값" 으로 자동으로 넘겨주는 값 되겠다.
근데...이거 딱 봐도 table row index 잖아?
그렇기 때문에, 만약
11. table 에
12. primary key auto increment ( int / long 여부는 무관 ) 필드가 있다면
13. Table 생성시에 자동으로 부여되는 row_id 를 반환하는 것이 아닌
14. 테이블의 primary key auto increment 의 필드값을 반환하여 row_id 를 대신한다
고 한다.
그렇기 때문에 lastInsertId() 대신 insert 의 리턴값을 써도 된다는군.
끝.
추신 : 인터넷 뒤져보니까, 이걸 코드로 실험해 본 용사가 있구만. : http://www.androidside.com/bbs/board.php?bo_table=b49&wr_id=115498
'프로그램 > 안드로이드' 카테고리의 다른 글
android gridview에서, 한 칸의 높이가 전체화면을 차지할때. (0) | 2014.12.08 |
---|---|
알서포트의 모비즌 프로그램을 PC에 설치하면, 안드로이드 VM (AVD ) 가 안돌아간다. (0) | 2014.12.03 |
안드로이드에서 SQLite 를 사용할 때, SQLiteOpenHelper 의 onCreate()는, 앱 설치할 때 최초 한번만 실행된다. (5) | 2014.11.20 |
안드로이드 + sqlite 에서, long 은 integer 로 동작한다. (0) | 2014.11.17 |
안드로이드에서 카메라 지정할 때, 카메라가 1개일때랑 2개일때랑 다르다. (1) | 2014.11.09 |