Android

[Android] 내장 메모리, 외장 메모리 / 앱별 저장소, 공용 저장소

haehyun 2022. 2. 22. 16:55

안드로이드 앱 데이터를 저장하는 방법

  1. 내부 데이터베이스에 저장하기
  2. 파일에 저장하기
    1. 내부 메모리에 저장하기
    2. 외부 메모리에 저장하기
      1. 앱 저장소에 저장하기
      2. 공용 저장소에 저장하기
  3. 공유된 프리퍼런스에 저장하기
    1. 액티비티 단위로 데이터 저장하기
    2. 앱 단위로 데이터 저장하기

 

안드로이드 파일 저장 경로

안드로이드에서 파일 저장소는 내장 메모리외장 메모리 공간으로 구분되며 외장 메모리 공간은 다시 앱별 저장소공용 저장소로 나뉜다. 내장 메모리는 이러한 구분이 없기 때문에 그 자체로 앱별 저장소이다.

앱별 저장소에는 다른 앱이 접근할 수 없지만 공용 저장소에는 다른 앱도 접근할 수 있다.

  • 내장 메모리 : 기기 자체의 메모리 공간
    • 앱별 저장소 : 개별 앱을 위한 공간
  • 외장 메모리 : SD카드와 같은 외부 저장장치 or 내부 저장소의 파티션
    • 앱별 저장소 : 개별 앱을 위한 공간
    • 공용 저장소 : 모든 앱을 위한 공간

 

내장 메모리의 앱별 저장소

/data/user/0/패키지명/files
  • 앱이 설치되면 시스템에서 자동으로 할당하는 공간.
  • 안드로이드 시스템에서 앱의 패키지명으로 만들어 주는 디렉터리.
  • 해당 앱에서만 접근할 수 있으며, 다른 앱에서는 접근할 수 없다.
  • 외장 메모리에 비해 용량이 적기 때문에 주로 저용량의 민감한 데이터를 저장한다.
  • 경로 : Context.filesDir 프로퍼티 값

 

외장 메모리의 앱별 저장소

/storage/emulated/0/Android/data/패키지명/files
  • 개별 앱에서 만든 파일을 저장하는 공간.
  • SD 카드와 같은 외부 저장 장치 또는 내부 저장소의 파티션을 나누어 제공하는 공간을 가리킨다.
  • 앱별 저장소는 개별 앱에 할당된 공간으로, 기본적으로 해당 앱에서만 접근 가능하다. 앱별 저장소의 파일을 외부 앱에서 접근하게 하려면 FileProvider로 공개해야 한다.
  • Environment.getExternalStorageState() 함수로 외장 메모리 사용 가능 여부를 체크할 수 있다.
  • 경로 : Context.getExternalFilesDir(null) 함수 리턴 값
    • 매개변수로 디렉터리 타입을 넘기면 해당 타입의 경로를 리턴한다.
    • ex) getExternalFilesDir(Environment.DIRECTORY_PICTURES)
  • 앱별 저장소는 앱이 삭제되면 파일도 모두 삭제된다.

 

외장 메모리의 공용 저장소

  • 앱에서 만든 파일을 모든 앱이 이용할 수 있게 하고 싶을 때 저장하는 공간.
  • ex) 카메라 앱에서 촬영한 사진 파일은 모든 앱에서 이용할 수 있어야 하기에 공용 저장소에 저장한다.
  • 공용저장소에 저장하면 파일을 만든 앱을 삭제해도 파일이 삭제되지 않는다.
  • 안드로이드 시스템에서 파일 종류에 따라 지정한 폴더
    • 사진, 음원, 문서 등 파일의 종류에 따라 저장하는 폴더를 지정해뒀다.
    • 파일 경로에 직접 접근하지 않고, 시스템이 제공하는 API를 이용해서 접근한다.
    • ex) 안드로이드 폰의 이미지(MediaStore.Images) 파일이 저장되는 공용저장소는 DCIM과 Pictures 디렉터리.

 

Cursor 객체

  • Cursor 객체가 사용되는 경우
    • contentResolver.query() 함수를 사용해 공용저장소에 질의문을 날리면 Cursor 객체가 반환된다.
    • SQLiteDatabase 객체의 rawQuery(), query() 함수를 사용해 내부 데이터베이스에 질의문을 날리면 Cursor 객체가 반환된다.
  • 위 경우에서 알 수 있듯이 Cursor 객체는 질의문(쿼리) 실행 결과, 테이블에서 조회된 행 집합을 가리키는 포인터이다.
  • Cursor객체의 count 속성이 2라면, 쿼리 조건에 부합하는 데이터(raw)가 2건 나온 것이다.
  • moveToFirst(), moveToNext() 등 함수로 선택 행을 이동할 수 있다. 보통 while(coursor.moveToNext()) { ... } 와 같이 조회된 모든 행에 차례대로 접근해서 각 행의 컬럼 값을 가져온다.