마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

sd카드나, 기기 내부 저장소 폴더인 download폴더에 DB 저장하는 방법

0 추천

Room 라이브러리를 사용 중인데, 아무리 검색해봐도,

저장 경로 변경 방법에 대한 답변이 나오지가 않습니다.

정말 이 질문에 대한 답을 어디서도 구할 수가 없네요.

무슨 노력의 문제가 아니라, 이건 가르쳐주는 사람이 있어야만 할 수 있는 것인데,

개발자 페이지에도 전혀 나와 있는게 없고, 참고할만한 자료도 없습니다.

기본 저장 경로에 저장되어 있는 DB파일을 sd카드나, 기기 내부의 저장

경로인 download 폴더에 옮겨 복사본을 만들고 싶습니다.

어째서 저처럼 질문하는 사람이 한 사람도 없는지 의아합니다.

 

지난번에 받은 답변이 아래와 같은데, 저는 코틀린 사용자라.. 자바에 대해서는 잘 모르는데, 답변은 자바로 되어 있습니다. getAppDatabase(context) 부분도 코틀린에서는 사용되지 않는 함수 같습니다. 아마 다른형태로 사용되지 않을까 추측은 됩니다.

AppDatabase라는 부분은 코틀린 영역에서 사용하면, 빨간 글씨가 되는데, 이 부분을 뭘로 대체해야 할지도

모르겠네요... instance라든지 byte copy는 또 무엇을 가리키는 것인지 모르겠어요. 코틀린 용어는 아닌것 같

은데, 대충 변수라고만 알고 있습니다.

 

 

AppDatabase appDatabase = AppDatabase.getAppDatabase(context);
appDatabase.close();
File dbfile = context.getDatabasePath(DATABASE_NAME);

이렇게 데이터 베이스를 읽으신 다음에 님이 지정하는 파일패스로 File instance를 만드신 다음 거기로 byte copy를 하세요.

 

코틀린으로 하려면 윗줄의 답변을 이렇게 수정해야 하는건가요?

val appDatabase: MemoDatabase = MemoDatabase.getInstance(requireContext())
appDatabase.close()
val dbfile: File = requireContext().getDatabasePath("memo_database")

이게 맞다면, 여기다 뭘 더 어떻게 해줘야 하는 건가요?

상쾌한 (1,890 포인트) 님이 2021년 5월 14일 질문
상쾌한님이 2021년 5월 14일 수정

1개의 답변

+1 추천
 
채택된 답변

실제 파일을 copy를 안하신 것 같은데요.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html

이 함수를 쓰씨면 될 것 같은데, 안된다면 루프를 돌면서 자바에서 하던대로 stream으로 읽어서 카피를 하시면 될 겁니다. 이것과 관련해서는 너무 많은 예제가 돌아다니기 때문에 굳이 반복하지 않겠습니다.

 

자바코드는 코틀린 코드랑 호환이 되게 되어 있습니다. 그리고 개발자 페이지 가시면 필요한 정보는 거의 다 존재한다고 보시면 됩니다. 물론 DB를 복사하는 건 가르쳐주지 않지만 파일을 복사하는건 알려주죠. 그리고 API 문서를 보시면

https://developer.android.com/reference/android/content/Context#getDatabasePath(java.lang.String)

getDatabasePath
Added in API level 1

public abstract File getDatabasePath (String name)
Returns the absolute path on the filesystem where a database created with openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) is stored.

The returned path may change over time if the calling app is moved to an adopted storage device, so only relative paths should be persisted.

위처럼 Datbase 경로를 리턴해주는 함수를  찾을 수 있습니다. 파일이 바이트 카피가 가능하다는건 이미 알고 계시다고 생각합니다. 개발자 문서가 모든 걸 다 알려주지는 않지만, 기본적인 지식을 조합해서 문제해결을 할 수 있도록 해주는 정보는 거의 다 가지고 있다고 봅니다.

spark (226,420 포인트) 님이 2021년 5월 14일 답변
상쾌한님이 2021년 5월 15일 채택됨
DB 파일이 바이트 카피 된다니 전혀 몰랐습니다. For문으로 루프 돌면서 복사...? Stream은 사용해봤지만, 어!?, 이걸로 어떻게 카피하죠? 물론 gson json으로 컨버터 해서 DB에 배열 데이터를 저장하는 과정에서 String 형태로 저장되어 있으니 stream을 사용할 수 있겠다는 생각은 들었지만, 이 DB정보들과 1대1로 매칭되는 키에 해당하는 id변수 값은 도대체 어떻게 복사하죠? 그걸 또 다시 다른 DB파일로 만드려면 어떻게 하나 싶은 생각이 들었습니다. 일단 해보고 나서 다시 여쭤보겠습니다. 아직 해보질 않아서 모르는게 너무 많습니다. 바이트 카피가 stream을 사용해서 DB에 저장된 정보를 어떤 변수에 담아놓았다가 다시 다른 DB파일에 넣어주는 거라면, 조금은 감이 오지만, 아... 뭔가 정보가 부족한것 같습니다. copyto부터 해봐야겠네요. 그게 더 간단한 방법이 아닌가 싶습니다.
...