준호씨의 블로그

아직 android sqlite 에서 foreign key 를 쓰기는 시기상조인 듯 본문

개발이야기

아직 android sqlite 에서 foreign key 를 쓰기는 시기상조인 듯

준호씨 2013.01.12 20:41

안드로이드 코딩을 하다가 Unit Test 만들어서 해 보는 겸 sqlite 에 대한 이런 저런 실험을 해 보고 있다.

foreign key 설정을 하고 없는 key 에 대한 데이터를 넣어 봤는데…

어랏? 들어갔다? -_-;

 

아래는 LogCat 으로 찍은 로그

image

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 를 지원안한다고 생각하고 개발을 하는게 속편할 듯 하다. 트리거를 이용한 편법도 있다고는 하지만 기본 지원안한다는 건 좀 답답하군.

2 Comments
댓글쓰기 폼