2011-11-05 2 views
1

모든 활동에서 액세스해야하는 데이터베이스를 사용하고 있습니다.모든 활동 중에서 동일한 데이터베이스를 공유하는 가장 좋은 방법

A : 그래서 나는 두 가지 방법을 볼 수있는 DB에 액세스하려면

GetData의 등 ...

을 만들 열려있는 모든 방법과 클래스 MyDBAdapter를 만들었습니다. 각 액티비티에는 다음과 같이 쓰여집니다 : MyDBAdapter db = new MyDBAdapter();

즉, 새 액티비티마다 DBAdapter가 생성됩니다. 각각은 동일한 DB를 열어 닫아야합니다. 이것은 또한 동일한 DB가 여러 활동에 의해 열릴 수 있음을 의미합니다. OK입니까? 또는 활동을 전환 할 때마다 DB가 닫히는 지 수동으로 확인합니까?

또는

b. 첫번째 액티비티에 DBAdapter 인스턴스를 하나만 생성하고 매번 다음 액티비티로 전달하십시오. putExtra("Task", x);

그런 다음 첫 번째 액티비티에서는 DB가 한 번 열리고 닫힙니다.

어느 쪽이 더 좋은 방법입니까?

대단히 감사합니다.

+0

를 호출하여 ContentResolver를 얻을. – andreapier

답변

1

일반적으로 데이터베이스 작업을 마친 직후에 데이터베이스를 닫아야합니다 (수동으로 db.close()라고 부름). 즉, 여러 활동에서 데이터베이스를 사용하는 경우 데이터베이스를 사용할 때마다 데이터베이스를 닫아야합니다. 즉, 모든 활동에 MyDBAdapter db = new MyDBAdapter(); 번으로 전화를 걸면 사용자에게 달려 있습니다. 그렇지 않으면 정적 참조가 생깁니다. 결국 일부 코드 블록에 로컬 변수 MyDBAdapter db이있는 경우 일부 지점에서 가비지 수집됩니다.

또한 일반적으로 데이터베이스 작업을 수행하지 않으려면 활동에서 데이터베이스 작업을 원하지 않습니다. 이러한 작업은 DB 스레드가 끝날 때까지 UI 스레드에서 실행되어 차단됩니다. DB 작업을 위해 AsyncTask을 사용하면 DB 작업을위한 별도의 스레드를 만들고 처리 할 수 ​​있습니다. AsyncTasks 사용에 대해서는 tutorial이 좋습니다.

+0

모든 onPause에서 db.close()를 수행하면 저장됩니까? 어쩌면 somehw가 이미 닫혀 있는지 확인하고 그냥 닫지 않으면 - 아니면 이미 닫힌 경우에도 닫을 수 있습니까? – user387184

+0

try-catch-finally 블록에서 if (db.isOpen()) -> db.close() 구문을 사용할 수 있습니다. – hovanessyan

2

나는 활동간에 데이터를 공유하기 위해 content provider을 선호합니다.
주로 응용 프로그램간에 공유를 목표로 설정되었지만 단일 응용 프로그램 내에서 사용할 수 있습니다.
콘텐츠 제공 업체를 사용하는 경우 db를 닫고 잠글 걱정이 없습니다.

Content providers은 공급자를 쿼리하고 결과를 반환하고 데이터를 추가, 변경 및 삭제할 수있는 공통 인터페이스를 구현합니다.

클라이언트가 간접적으로 사용하는 인터페이스로, 가장 일반적으로는 ContentResolver 개 개체가 있습니다. 당신은 당신이 다른 응용 프로그램에서하지만 동적 하나 대신에 정적 참조를 사용할 수있는 동일한 응용 프로그램의 다양한 활동에 DB를 사용할 필요가없는 경우 getContentResolver()

확인이 Simple Content Provider for db operations

+0

감사합니다 - 다음번에 고려할 것입니다 - 현재 앱의 경우 모든 코드를 변경하기가 너무 쉽습니다 ... – user387184

관련 문제