2011-09-21 6 views
10

각 테이블에 대해 콘텐츠 제공을하거나 모두를위한 하나를 사용하는 SQLite 데이터베이스 액세스를 위해안드로이드 : 각 테이블에 대한 컨텐트 프로/처리 일대 다 관계

  1. 더 나은 연습을 콘텐츠 공급자를 사용하여 테이블?
  2. 새 레코드를 만들 때 일대 다 관계를 처리하는 방법은 무엇입니까?
+0

SQL 데이터베이스 디자인, CREATE 문에 대해 이야기하고 있거나 콘텐츠 공급자 측에서이 작업을 수행하는 방법에 대해 궁금한 점이 있다면 "일대일 관계를 처리하는 방법"이란 의미에 대해 좀 더 자세히 설명해 주실 수 있습니까? – AGrunewald

답변

15

컨텐트 프로는

컨텐트 프로이 방법은 데이터베이스없는 콘텐츠 공개적으로 (또는 반 공개) 데이터에 액세스한다. 이것은 파일 액세스, SQLite 또는 심지어 웹 액세스를 통해 여러 가지 방법으로 수행 할 수 있습니다. ContentProvider 자체는 데이터베이스가 아니지만 데이터베이스를 프로그래밍 할 수 있습니다. 또한 동일한 데이터베이스에 액세스하는 여러 ContentProvider를 가질 수 있지만 요청자에 따라 다양한 수준의 액세스 또는 동일한 내용을 다른 방식으로 배포 할 수 있습니다.

정말로 묻는 것은 ContentProvider 질문이 아니라 데이터베이스 질문인데, "Question with SQLite database에서의 관계 처리 방법"입니다. 왜냐하면 ContentProvider가 SQLiteOpenHelper 및 기타 유사 코드를 통해 지시하지 않으면 데이터베이스 코드를 사용하지 않기 때문입니다. 수업. 따라서 데이터베이스 액세스를 올바르게 프로그래밍하면 SQLite 데이터베이스가 원하는대로 작동합니다.

데이터베이스 데이터베이스 예전에

이며, 데이터베이스는 각 테이블의 성장을 허용하는 것이 자신의 실체를했다 단순히 플랫 파일이었다. 이제는 DBMS를 사용하여 그렇게 할 이유가 거의 없습니다. SQLite는 이와 관련하여 다른 데이터베이스 플랫폼과 동일하며 테이블 공간을 확보 할 수있는 많은 테이블을 수용 할 수 있습니다.

SQLite는

은 처리 어떤 것을, SQLite는 잘 처리하는 특정 기능이 있습니다 -뿐만 아니라, 일부는 전혀 처리하지 않습니다. 관계는 외래 키 지원없이 출하 되었기 때문에 Android의 일부 SQLite 버전에서 제외 된 항목 중 하나입니다. 이것은 고도로 요구되는 기능이었고 그것은 안드로이드 2.2까지 출시되지 않은 SQLite 3.6.22에 추가되었습니다. 그러나 최초의 화신으로 많은 버그가보고되었습니다.

는, 결국, 외래 키는 단지 필드 전 2.2

다행히되는 SQL을 준수하고 간단한 DBMS (이 시간에하지 RDBMS),이 문제를 해결하는 몇 가지 쉬운 방법이 있습니다 안드로이드 다른 테이블.당신이 당신의 CREATE TABLE 문을 사용할 때

  1. 당신은 CONSTRAINT의를 생성하여 데이터베이스 INSERTUPDATE 문을 적용 할 수 있습니다.
  2. 외래 키를 얻기 위해 다른 테이블에 _id을 쿼리 할 수 ​​있습니다.
  3. INNER JOIN을 사용하여 적절한 SELECT 문을 사용하여 원본 테이블을 쿼리하여 의사 관계를 적용 할 수 있습니다.

의 Android 버전은 직접 관계를 시행하지 않으므로 CASCADE ON DELETE을 수동으로해야합니다. 그러나 이것은 다른 간단한 SQL 문을 통해 수행 할 수 있습니다. 필자는 모든 종류의 관계를 수작업으로 수행해야하기 때문에 본인의 라이브러리를 본질적으로 작성했습니다. 그러나 SQLite와 SQL의 효율성이 매우 빠르고 쉽다고 말할 수 있습니다. 다음과 같이

은 본질적으로, 어떤 시행의 관계에 대한 프로세스가 진행됩니다

  • JOIN를 사용하여 외부 키를 필요로하는 쿼리에서. INSERT에서
  • 는 다른 TABLE의 외래 키 기본 키 필드 상 UPDATE에서 NOT NULL
  • 의 외래 키 필드에 CONSTRAINT을 사용하여 외래 키가 관련 TABLE상의 제 UPDATE을 실행. (캐스케이 업데이트)
  • 동일한 매개 변수를 사용하는 DELETE의 경우 DELETE이있는 곳에는 foreign_key = _id이됩니다 (DELETE 행보다 먼저 _id이 나오는지 확인하십시오).

안드로이드 2.2

외부 키는 지원되지만 기본적으로 꺼져 있습니다. 먼저 다음을 켜야합니다.

db.execSQL("PRAGMA foreign_keys=ON;"); 

다음으로 관계 TRIGGER을 만들어야합니다. 이 작업은 별도의 TRIGGER 문 대신 TABLE을 만들 때 수행됩니다. 아래를 참조

// Added at the end of CREATE TABLE statement in the MANY table 
FOREIGN KEY(foreign_key_name) REFERENCES one_table_name(primary_key_name) 

SQLite는과 그 기능에 대한 자세한 내용은 SQLite official site을 확인하십시오. 이는 다른 RDBMS에서 수행하는 JOIN을 모두 가지지 않기 때문에 중요합니다. Android의 SQLite 클래스에 대한 자세한 내용은 the documentation을 참조하십시오.

+0

무슨 크래킹 답변, 고맙습니다.나는 많은 데이터베이스 (MySQL, MSSQL, Postgres, Ingres, SQLite 등)에 익숙하지만 이것은 첫 번째 안드로이드 앱이며 JAVA에 대해 더 많이 잊어 버렸다. 정말 고심하는 안드로이드 특정 구문과 나는 내 질문에 명확하게해야하지만 당신은 내 지식에 특히 fk의 전환에 몇 가지 심각한 차이를 강조 표시해야합니다. 더 구체적인 질문을하기에 충분한 정보를 얻었으므로 답변을 받아 들일 것입니다. 다른 사람들이이 정보를 매우 유용하게 사용할 것이라고 확신합니다. 다시 한 번 감사합니다 – jamesc

+0

고맙습니다. –

5

첫 번째 질문은 모든 테이블에 대해 콘텐츠 공급자를 만들 필요가 없습니다. 여러 테이블을 사용할 수 있지만 각 테이블마다 공급자의 복잡성이 증가했습니다.

+0

고맙습니다. 모든 질문에 대한 답변을 얻지 못했지만 귀하의 질문에 답변하지 않으려 고하지만 귀하의 정보를 높이 평가합니다. – jamesc

+0

안녕하십니까. –

1

콘텐츠 공급자는 데이터베이스의 개념과 대략 동일합니다. 데이터베이스에는 여러 개의 테이블이 있으므로 컨텐츠 공급자에 여러 개의 테이블이있는 것이 좋습니다.

일대 다 관계는 다른 데이터베이스와 마찬가지로 처리 할 수 ​​있습니다. 다른 데이터베이스와 마찬가지로 참조 및 외래 키를 사용하십시오. CASCADE ON DELETE와 같은 것을 사용하여 다른 테이블에서 참조하는 레코드가 삭제 될 때 레코드가 삭제되도록 할 수 있습니다.