준호씨의 블로그
아직 android sqlite 에서 foreign key 를 쓰기는 시기상조인 듯 본문
안드로이드 코딩을 하다가 Unit Test 만들어서 해 보는 겸 sqlite 에 대한 이런 저런 실험을 해 보고 있다.
foreign key 설정을 하고 없는 key 에 대한 데이터를 넣어 봤는데…
어랏? 들어갔다? -_-;
아래는 LogCat 으로 찍은 로그
DB 리스트를 조회 해 봤을 때 category 가 FK 로 연결된 테이블에 없는 값인데도 들어갔다.
(심지어 category 는 INTEGER 타입인데 한글이 들어갔다 -_-; 자료형 상관없이 데이터를 막막 넣을 수 있다는거 같은데 이에 대해서는 따로 정리 하도록 하자.)
인터넷을 뒤져 보니 foreign key 를 제대로 지원 하지 않는다는 글이 많은데 옵션을 활성화 시켜 주면 된다는 말도 있는데 옵션은 켜 줘도 안되더라.
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
인터넷 어디선가 업어온 코드인데 DB 생성 쿼리 전에 넣어 줬는데 동작 안하더라. 다른 방법이 있는 걸까?
지원 여부에 대한 sqlite 홈페이지 글
http://www.sqlite.org/foreignkeys.html#fk_enable
In order to use foreign key constraints in SQLite, the library must be compiled with neither SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined. If SQLITE_OMIT_TRIGGER is defined but SQLITE_OMIT_FOREIGN_KEY is not, then SQLite behaves as it did prior to version 3.6.19 - foreign key definitions are parsed and may be queried using PRAGMA foreign_key_list, but foreign key constraints are not enforced. The PRAGMA foreign_keys command is a no-op in this configuration. If OMIT_FOREIGN_KEY is defined, then foreign key definitions cannot even be parsed (attempting to specify a foreign key definition is a syntax error).
FK 쓰려면 컴파일 할때 SQLITE_OMIT_FOREIGN_KEY 랑 SQLITE_OMIT_TRIGGER 가 선언되어 있지 않아야 된다는 듯하다. (내가 아는 문법에는 neither a nor b 인데 위의 문장은 or 이라 제대로 해석한건지는 모르겠음) 그런데 SQLITE_OMIT_TRIGGER 가 선언되어 있으면 3.6.19 이전 버전처럼 FK 를 파싱만 하고 쓰지는 않는다고 함.
안드로이드에서 사용하는 sqlite 는 3.5.9~3.7.11 등 다양한 버전이 사용 되고 있다. 일단 한동안은 FK 를 지원안한다고 생각하고 개발을 하는게 속편할 듯 하다. 트리거를 이용한 편법도 있다고는 하지만 기본 지원안한다는 건 좀 답답하군.
'개발이야기' 카테고리의 다른 글
스킨 정리 작업 (0) | 2013.01.23 |
---|---|
13회 Daum DevDay 신청 (0) | 2013.01.15 |
리눅스 버전 확인하기, 비트확인 (8) | 2013.01.11 |
arm-linux-gcc를 사용해 "hello arm" 만들기. android adb shell에서 돌려보기. ARM GCC 3.4.3 이용 크로스컴파일 (6) | 2011.10.19 |
네이버 개발자센터에서 git와 mercurial 을 제공하는 군요 +_+ (4) | 2011.06.10 |