프로그래밍 언어/Android

Android에서 SQLite의 모범 사례

Rateye 2021. 6. 29. 10:01
728x90
반응형
질문 : Android에서 SQLite의 모범 사례는 무엇입니까?

Android 앱 내에서 SQLite 데이터베이스에 대한 쿼리를 실행할 때 모범 사례로 간주되는 것은 무엇입니까?

AsyncTask의 doInBackground에서 삽입, 삭제 및 선택 쿼리를 실행하는 것이 안전합니까? 아니면 UI 스레드를 사용해야합니까? 데이터베이스 쿼리가 "무거울 수 있고"앱을 잠글 수 있으므로 UI 스레드를 사용하면 안된다고 가정합니다. 결과적으로 ANR (응용 프로그램 응답 없음 )이 발생합니다.

AsyncTask가 여러 개인 경우 연결을 공유해야합니까, 아니면 각각 연결을 열어야합니까?

이러한 시나리오에 대한 모범 사례가 있습니까?

답변

삽입, 업데이트, 삭제 및 읽기는 일반적으로 여러 스레드에서 괜찮지 만 Brad의 대답 은 올바르지 않습니다. 연결을 만들고 사용하는 방법에주의해야합니다. 데이터베이스가 손상되지 않더라도 업데이트 호출이 실패하는 상황이 있습니다.

기본적인 대답입니다.

SqliteOpenHelper 개체는 하나의 데이터베이스 연결을 유지합니다. 읽기 및 쓰기 연결을 제공하는 것처럼 보이지만 실제로는 그렇지 않습니다. 읽기 전용을 호출하면 상관없이 쓰기 데이터베이스 연결을 얻을 수 있습니다.

따라서 하나의 도우미 인스턴스, 하나의 db 연결. 여러 스레드에서 사용하더라도 한 번에 하나씩 연결합니다. SqliteDatabase 개체는 Java 잠금을 사용하여 액세스를 직렬화합니다. 따라서 100 개의 스레드에 하나의 db 인스턴스가있는 경우 실제 온 디스크 데이터베이스에 대한 호출이 직렬화됩니다.

따라서 하나의 도우미, 하나의 db 연결은 Java 코드로 직렬화됩니다. 하나의 스레드, 1000 개의 스레드, 그들간에 공유되는 하나의 도우미 인스턴스를 사용하는 경우 모든 db 액세스 코드는 직렬입니다. 그리고 인생은 좋다.

동시에 실제 고유 연결에서 데이터베이스에 쓰려고하면 실패합니다. 첫 번째 작업이 완료 될 때까지 기다린 다음 쓰지 않습니다. 단순히 변경 사항을 기록하지 않습니다. 더 나쁜 것은 SQLiteDatabase에서 올바른 버전의 삽입 / 업데이트를 호출하지 않으면 예외가 발생하지 않습니다. LogCat에서 메시지를 받으면 그게 될 것입니다.

그래서, 여러 스레드? 하나의 도우미를 사용하십시오. 기간. 하나의 스레드 만 쓸 것이라는 것을 알고 있다면 여러 연결을 사용할 수 있으며 읽기 속도가 빨라질 수 있지만 구매자는주의해야합니다. 나는 그렇게 많이 테스트하지 않았습니다.

다음은 훨씬 자세한 내용과 예제 앱이 포함 된 블로그 게시물입니다.

Gray와 저는 실제로 그의 Ormlite를 기반으로하는 ORM 도구를 마무리하고 있는데, 이는 Android 데이터베이스 구현에서 기본적으로 작동하며 블로그 게시물에서 설명하는 안전한 생성 / 호출 구조를 따릅니다. 곧 나올 것입니다. 구경하다.

그 동안 후속 블로그 게시물이 있습니다.

또한 앞서 언급 한 잠금 예제의 2point0 으로 포크를 확인하십시오.

출처 : https://stackoverflow.com/questions/2493331/what-are-the-best-practices-for-sqlite-on-android
728x90
반응형