SQLite의 장단점 및 공유 환경 설정 [닫기]


155

SQLite 데이터베이스와 공유 환경 설정간에 정보를 저장하는 좋은 메커니즘은 무엇입니까?

공유 환경 설정을 사용하는 이유는 무엇입니까? 왜 sqlite를 사용합니까? 나는 그들 사이의 차이점을 찾으려고 노력했으며 이것이 데이터 저장을위한 더 좋은 메커니즘이지만 Google에서 적절한 답변을 찾을 수 없습니다. 예와 설명을 도와주세요.


저장하려는 데이터의 종류에 따라 다릅니다. SharedPreferences를 사용하면 데이터에 더 빠르고 간단하게 액세스 할 수 있으므로 소량의 데이터를 보관할 때 사용하기가 더 편리합니다.
Egor

2
docs에도 불구하고 간단한 문자열 및 프리미티브를 제외하고 공유 환경 설정에 아무것도 저장하지 마십시오. 문서마다 별도의 파일을 사용하는 경우 공유 환경 설정은 스레드 안전하지 않으며 메인 스레드에서만 사용하더라도 손상이 심할 경우 더 많이 저장해야합니다 파일에서 1 개 이상의 키 값 쌍.
RunLoop

SharedPreferences는 처음 사용 후 메모리에 캐시되므로 결과적으로 Read를 사용하면 상당히 빠릅니다.
Stan

답변:


168

실제로 저장하려는 데이터에 따라 다릅니다.

SQLite

데이터베이스는 이러한 종류의 데이터를 위해 설계되었으므로 대량의 동일한 구조화 된 데이터를 SQLite 데이터베이스에 저장해야합니다. 데이터는 데이터베이스에 의해 구조화되고 관리되므로 SQL과 같은 쿼리 언어를 사용하여 특정 기준과 일치하는 하위 데이터 세트를 가져 오도록 쿼리 할 수 ​​있습니다. 이를 통해 데이터를 검색 할 수 있습니다. 물론 많은 양의 데이터를 관리하고 검색하면 성능에 영향을 미치므로 데이터베이스에서 데이터를 읽는 것이 SharedPreferences에서 데이터를 읽는 것보다 느릴 수 있습니다.

SharedPreferences

SharedPreferences는 특정 키 아래에 데이터를 저장할 수있는 키 / 값 저장소입니다. 상점에서 데이터를 읽으려면 데이터의 키를 알아야합니다. 따라서 데이터를 매우 쉽게 읽을 수 있습니다. 그러나 소량의 데이터를 저장하는 것만 큼 쉬운 것은 모든 단일 데이터에 대해 키를 정의해야 할 때 큰 구조적 데이터를 저장하고 읽는 것이 어렵 기 때문에 특정 개념이 없다면 데이터 내에서 실제로 검색 할 수 없습니다 키의 이름을 지정합니다.


24
예를 들어 SharedPreferences는 저장해야하는 소수의 변수가있는 사용자 기본 설정을 저장하는 데 유용합니다. 반면에 SQLite는 음악 라이브러리의 노래 제목과 같이 검색해야 할 항목이 많은 곳에 데이터를 저장하는 것이 좋습니다.
CL22

5
SharedPreferences를 사용하기 위해 키 이름을 몰라도됩니다. getAll ()을 참조하십시오.
ZaBlanc

5
참고로, THIRD 옵션이 있습니다 : 파일에 XML 읽기 / 쓰기. (android.util.xml 클래스 참조) 한 번에 모두 읽고 쓸 수있는 약간 복잡한 데이터에 적합합니다. 예를 들어, 사용자가 자주 변경하지 않는 값의 그리드. 특히 나중에 다른 곳에서 보내려는 데이터 인 경우 구문 분석 가능한 형식이 필요합니다.
ToolmakerSteve

1
공유 pref에서 json을 json 문자열로 저장하는 것이 좋습니다?
Kaveesh Kanwal

2
@JCarlos 크로스 프로세스 작업을 수행하지 않는 한 SharedPreferences를 사용하는 것이 좋습니다.
Mygod

96

이 질문에 대한 답은 있지만 속도와 관련하여 더 많은 주제가 있다고 생각합니다.

응용 프로그램의 SharedPreferences와 Sqlite DB는 모두 파일 일 뿐이며 장치의 파일 시스템에있는 응용 프로그램의 디렉토리에 저장됩니다. 데이터의 양이 너무 크지 않으면 Sqlite 옵션은 더 간단한 액세스를 위해 처리 오버 헤드가 더 큰 더 크고 복잡한 파일을 포함합니다.

따라서 데이터의 특성이 (응답에 설명 된대로) 선택을 지시하지 않고 속도가 중요한 경우 SharedPreferences를 사용하는 것이 좋습니다.

그리고 일부 데이터를 읽는 것은 종종 주요 활동을 표시하는 중요한 경로에 있으므로 속도가 매우 중요하다고 생각합니다.

속도와 효율성에 대한 마지막 생각-구조화 된 일부 데이터에 Sqlite 데이터베이스를 사용해야하는 경우 데이터베이스에 사용자 기본 설정을 저장하는 것이 더 효율적이므로 두 번째 파일을 열지 않아도됩니다. 이것은 상당히 사소한 고려 사항입니다. 주요 활동을 표시하기 전에 구조화 된 데이터와 기본 설정 모두에 액세스해야하는 경우에만 고려할 가치가 있습니다.


6
코드 가독성은 어떻습니까? db 테이블 대신 SharedPrefs에 여러 레코드를 저장할 때 코드가 복잡해집니다. SQL 구문은 SharedPrefs 항목을 반복하는 것보다 읽기 쉽습니다 ...
IgorGanapolsky

8
이고르, 동의하지 않습니다. SharedPreferences는 실제로 1 차원이며, 환경 설정을 사용하는 것이 매우 간단합니다. 예를 들어, 재고 확인 앱을 구축하고 있으며 기본적으로 주식 기호를 저장하고 있습니다. 나는 항상 그것들을 모두 나열하기 때문에 개별적으로 잡을 필요가 없으며, 이것이 내가하는 일, 저장 또는 잡는 것입니다. DB를 사용하는 것보다 훨씬 간단합니다.
AutoM8R

1
저장할 데이터의 구조가 계층 데이터베이스의 사용을 요구하지 않는 동안 코드의 가독성이 어려운 상황을 생각할 수 없습니다. 가독성 문제가 있더라도 필요한 함수가 포함 된 래퍼 클래스를 사용하여 해결할 수 있습니다.
Sarath Sadasivan Pillai

1
공유 환경 설정에서 jsonstring 데이터 형식으로 여러 키-값을 저장할 수 있습니까? 내 json 값을자를 수있는 문자 제한이 있습니까?
Nova

2
SharedPreferences는 한 번만 (앱 프로세스 수명주기마다) 메모리에로드되어 유지됩니다. 그 후에는 항상 매우 빠릅니다. 따라서 SharedPref 데이터를 SQLite에 넣음으로써 실질적인 성능상의 이점은 없습니다 (추가 SharedPref 파일 액세스를 피하기 위해). 그런데 SQLite를 SharedPrefs에 넣지 말아야합니다. 내가 말했듯이, 그것은 항상 메모리에있어서 문제를 일으킬 수 있습니다 (메모리 부족 문제).
Zsolt Safrany

20

내 속도는 속도 나 크기가 아니라 데이터에 대해 수행하려는 작업의 종류입니다.

당신이하려는 경우 가입 , 종류 , 및 기타 DB 작업 데이터에 다음 갈 SQLite는 . 예를 들어 날짜별로 데이터를 정렬합니다.

int, boolean, String과 같은 간단한 값을 매핑하려면 Preferences 를 사용하십시오 . DB 작업은 여기서 작동하지 않으며 모든 키가 필요하다고 말할 필요가 없습니다. 예를 들어 사용자 비밀번호 또는 앱 구성이 있습니다.

환경 설정을 채택하려는 큰 유혹은이를 사용하여 플랫 화 된 POJO (직렬화 된 JSON 오브젝트)를 문자열로 저장하려는 경우입니다. 실제로 그러한 필요는 Sqlite를 사용하는 표시입니다. 왜 ? 복잡한 데이터는 결국 복잡한 opration이 필요하기 때문입니다. 간단한 "SELECT ... WHERE id = 1"로 처리 할 수있는 특정 항목을 검색한다고 상상해보십시오. 환경 설정 경로에서 이는 직렬화 해제에서 결과 반복까지 오랜 시간이 소요됩니다.


또한 SharedPreferences는 트랜잭션을 지원하지 않으므로 트랜잭션이 필요한 경우 SQLite를 사용하십시오. 예를 들어, 사용자가 "로그 아웃"버튼을 누르면 SharedPreferences한 번에 여러 키 / 값 을 지우고 (예 : 키 userpassword키 모두 ) 두 키가 설정되지 않았거나 두 키가 모두 설정되어 있는지 확인할 수 있습니다.
runeks

5
  • 방대한 양의 데이터를 저장하려면 SQLite 데이터베이스 시스템으로 이동하십시오. 이를 통해 사용자는 데이터를 검색 할 수 있습니다.

  • 반면에 소량의 데이터를 저장하려면 공유 환경 설정으로 이동하십시오. 이 경우 거대한 데이터베이스 시스템이 필요하지 않습니다. 이를 통해 사용자는 단순히 데이터를 저장하고로드 할 수 있습니다.


1
300 개의 키-값 쌍은 엄청난 양의 데이터입니까? 정확히 보관해야합니다.
JCarlosR

1
이 경우 SQLite 데이터베이스로 이동해야합니다. 그렇지 않으면 300 개의 데이터를 관리하고 검색하기가 어렵습니다.
Sami Al-Jabar

그러나 모든 키를 알고 있다면 공유 환경 설정에서 데이터를 가져 오는 것이 더 쉽지 않습니까?
Arjun

-6

SQLLite는 SharedPreferences를 잊어 버리고 Realm을 사용하십시오. 모든 로컬 스토리지를위한 단일 솔루션. 평범한 오래된 Java 객체를 RealmObject로 사용하여 데이터를 저장할 수 있습니다. 선택 쿼리를 JSON 파일로 변환 할 수 있습니다. 전체 데이터베이스를 구문 분석 할 필요가 없습니다. 이 링크를 확인하십시오 : https://realm.io/news/introducing-realm/


12
당신이 알고있는 모든 것을 잊어 버리십시오.
Andrew G
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.