앱의 데이터 내보내기 및 가져오기 기능

4206 단어 android


휴대전화가 선택이 아닌 일상의 필수 도구가 된 지 오래다. 사람들은 모든 종류의 중요한 일을 위해 앱을 사용하고 있으며 이러한 앱 중 하나에 대한 액세스 권한이 손실되면 사람들은 화를 낼 것입니다.

그러한 앱의 앱 개발자가 되는 것은 약간의 책임이 있습니다. 사용자는 데이터를 백업하고 필요에 따라 새 장치로 전송할 수 있어야 합니다. Android에는 사용자가 새 기기를 받을 때 앱 데이터를 복원하는 기능auto-backup feature이 있습니다. 그러나 때로는 이 메커니즘이 실패하고 중요한 데이터에 대한 주문형 내보내기/가져오기 기능이 있는 필수 앱의 경우 사용자에게 약간의 마음을 줍니다.

이 게시물에서는 이러한 메커니즘을 구현하는 가장 간단한 방법을 설명합니다. 가장 효율적이거나 진보된 방법은 아닐지 모르지만 기본적인 것이 필요하다면 그것으로 충분할 것입니다.

회의실 데이터베이스 대량 쿼리



우선 데이터를 데이터베이스로 대량 추출하고 대량으로 가져올 수 있는 방법이 필요합니다. Jetpack Room 을 사용하고 있다고 가정하고 요즘 Android 세계에서 사실상의 DB 계층이라고 생각하는 DAO 객체를 확장하여 다음을 포함합니다.

@Dao
interface ItemsDao {

    [...]

    @Query("SELECT * FROM item")
    fun listAll(): List<Item>

    @Insert
    fun insertAll(tasks: List<Item>): List<Long>
}


데이터 내보내기




private val exportDataLauncher =
    registerForActivityResult( // 1.
        ActivityResultContracts.CreateDocument()) { // 2.
    if (it == null) return@registerForActivityResult // 3.
    val jsonString = Gson().toJson(itemsDao.listAll()) // 4.
    requireContext().contentResolver.openOutputStream(it) // 5.
         ?.bufferedWriter()?.apply {
             write(jsonString)
             flush()
         }
}

fun onExportDataClicked() {
    exportDataLauncher.launch("backup${Date().time}.json") // 6.
}


  • 일부 데이터를 반환하는 Android의 newer way of launching Activities입니다. 계약(2 참조)은 시작된 인텐트의 세부 사항을 정의하고 있으며, 처리할 수 있도록 시작된 활동에서 반환된 데이터로 콜백이 호출됩니다. Fragment 또는 Activity가 생성되기 전에 registerForActivityResult()를 호출해야 합니다.
  • 이 경우에는 ActivityResultContract라는 "내장"CreateDocument을 사용하고 있습니다. 이름에서 알 수 있듯이 사용자가 내보낸 파일을 저장할 위치를 결정할 수 있도록 파일 선택기를 엽니다.
  • 사용자가 파일 선택기를 취소하면 콜백이 계속 호출되지만 null 가 포함됩니다.
  • 내보낸 데이터를 파일에 저장하려면 직렬화 메커니즘을 선택해야 합니다. 단순화를 위해 우리는 Gson(좋아하는 JSON 라이브러리 사용)을 사용하여 대량 쿼리itemsDao.listAll()의 결과를 간단한 문자열로 직렬화합니다.
  • 파일 선택기의 결과는 Uri 입니다. ContentResolver를 사용하여 UriOutputStream로 변환하고 JSON 문자열을 파일 시스템에 씁니다.
  • 마지막으로 이것을 실행해야 합니다. ActivityResultContract의 입력은 기본 파일 이름입니다. 이 방법을 사용하여 파일을 덮어쓸 수 없으므로 이미 존재하는 파일을 선택하면 번호가 붙은 접미사가 추가됩니다(예: "파일(1)", "파일(2)"등).

  • 데이터 가져오기




    private val importDataLauncher = registerForActivityResult(
        ActivityResultContracts.OpenDocument()) { // 1.
            if (it == null) return@registerForActivityResult
            val jsonString = // 2.
                requireContext().contentResolver.openInputStream(it)
                            ?.bufferedReader()?.readText() ?: "[]"
                val listType: Type = object : TypeToken<List<Item>>() {}.type
                val items: List<Item> = 
                    Gson().fromJson(jsonString, listType) // 3.
                itemsDao.insertAll(items) // 4.
        }
    
    fun onImportDataClicked() {
        importDataLauncher.launch(arrayOf("*/*")) // 5.
    }
    


  • 이번에는 기존 파일을 선택하기 위해 파일 선택기 대화 상자를 여는 계약을 사용하고 있습니다.
  • 이번에는 반환된 UriInputStream로 변환합니다.
  • 파일 콘텐츠를 모델로 역직렬화합니다. 우리의 경우 Gson은 JSON 목록을 항목 목록으로 변환하는 데 사용됩니다.
  • 데이터베이스로 대량 가져오기.
  • 파일 선택기 대화 상자를 시작합니다. 여기서 ActivityResultContract의 입력은 허용된 파일의 MIME 유형입니다.

  • 이제 빠른 데이터 가져오기/내보내기 기능을 생성할 수 있는 빠른 메커니즘이 생겼기를 바랍니다. 위의 코드 스니펫에는 적절한 오류 처리 기능이 없으므로 실제 앱에서 사용하기 전에 직접 추가해야 합니다.

    즐거운 코딩하세요!

    좋은 웹페이지 즐겨찾기