프로그램/안드로이드

SQLite 에서, insert() 의 반환값은 lastInsertId() 와 같은 역할을 한다.

(주)CKBcorp., 2014. 11. 24. 05:00
반응형



결론부터 말하면 그러하다. 자세한건 아래를 참고.

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










 


반응형