2013-07-01 3 views
3

Android 앱에서 SQLite를 사용하기 시작했습니다. 필자는 데이터베이스에 익숙하지 않은데, 필자는 오랜 세월에 걸쳐 데이터베이스를 사용하여 작업을 수행하는 Delphi와 데이터베이스 작업을 수행했습니다.Android SQLite 열 및 인덱스 모범 사례

앱에서 여러 개의 열이있는 표가있을 수 있습니다. 테이블에서 데이터를 읽을 때 SQL을 실행 한 다음 커서를 사용하여 데이터에 액세스합니다.

데이터에 액세스하는 커서에는 몇 가지 방법이 있습니다. 하나는 테이블에서 열 인덱스를 사용합니다. 예를 들어 인터넷에서 보았던 여러 가지 예가이를 사용합니다. 당신이 사용할 수 있도록 코드에 포함 된 "3"가장 큰 생각이 아니다 갖는

cursor.getString(3); 

: 예를 들어

int idx = cursor.getColumnIndex("THECOLUMNNAME"); 
cursor.getString(idx); 

을 getColumnIndex를 (사용) 테이블 및 열 번 이상은 낭비 . 인덱스의 상수를 유지하면 몇 10s 또는 100s 열이 될 수 있습니다. 오류가 발생하기 쉽습니다.

제 질문은 - 이런 종류의 일을하는 가장 좋은 방법은 무엇입니까?

특정 표를보다 잘 나타내려면 커서를 확장해야합니까?

감사합니다,

마이크

커서의 적어도 일부 구현에서
+2

IMO, "100s columns"이있는 테이블은 잘못된 테이블 디자인의 표시입니다. 특히 모바일 응용 프로그램의 경우. –

+1

getColumnIndex를 사용하면이 작업을 수행하는 것이 가장 좋습니다. –

+0

OK - 많은 테이블에서 100 열의 열이 무엇인지 의미합니다. 그것은 여전히 ​​추적 할 수있는 열 인덱스의 100s입니다. –

답변

3

매우 적은 수의 열과 특히 해당 열의 이름이 SELECT MAX(x), MIN(x) FROM t 인 경우 고정 열 인덱스를 사용하면 문제가 없습니다. 열의 수/순서가 나중에 변경되거나 소스 코드에서 커서 액세스와 쿼리 사이에 거리가 먼 경우가 더 위험합니다.

getColumnIndex 호출을 너무 많이 보내지 않으려면 반환 값을 실제로 캐시해야합니다.

Cursor cursor = db.query(...); 
Field foo = new Field(cursor, "FOO"); 
Field bar = new Field(cursor, "BAR"); 
while (cursor.moveToNext()) { 
    foo.getString(); 
    bar.getInteger(); 
} 

(이 클래스의 구현 ... 운동으로 남아)

: 이 것은 열 색인이 같은 커서에 대한 참조를 모두 포함 래퍼 클래스로 쉽게 만들어 질 수있다
+0

정말 대단합니다 - 고마워요. 나는 그 방법을 가겠다. –

1

, 열 이름의 배열을 통해 getColumnIndex 반복 (하나의 예를 들어 here를 참조하십시오.) 쿼리가 많은 수있는 테이블을 포함하는 경우 결과에서 행을 순환하기 전에 열 인덱스를 캐시 할 수 있습니다.

그러나 다른 의견에서 지적한 것처럼 많은 수의 열이 잘못된 데이터베이스 디자인의 증상 일 수 있습니다.

+0

고마워요, 그 링크를 살펴 보겠습니다.다시 말하지만, 하나의 테이블에 많은 수의 열을 의미하는 것은 아니지만, sevarl 테이블을 가진 앱은 쉽게 100 개의 열을 가질 수 있습니다. 필자는 테이블에 10 개의 열이있는 정규화 된 데이터베이스로 작업했습니다. 원래 게시물을 편집하여 포인트를 만들 것이라고 생각합니다. –