У меня есть приложение Android Jetpack Compose в Kotlin с функцией, требующей контекста. Функция показана ниже.

fun copyDataBase(context: Context, OUTPUT_DB_PATH: String, DB_NAME: String) {
    // Path to output database path (application database path).
    var APP_DB_FILE_PATH = OUTPUT_DB_PATH + "/" + DB_NAME

    // Path to input database file.
    var INPUT_DB_PATH = "database/" + DB_NAME

    // Open your local db as the input stream
    val databaseInput: InputStream = context.getAssets().open(INPUT_DB_PATH)

    // Open the empty db as the output stream
    val databaseOutput: OutputStream = FileOutputStream(APP_DB_FILE_PATH)

    // Transfer bytes from the inputfile to the outputfile
    val buffer = ByteArray(1024)
    var length: Int
    while (databaseInput.read(buffer).also { length = it } > 0) {
        databaseOutput.write(buffer, 0, length)
    }

    // Close the streams
    databaseOutput.flush()
    databaseOutput.close()
    databaseInput.close()
}

А потом в основном занятии делаю это.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // How can I get context to supply to the function?
        copyDataBase(context, DB_PATH, DB_NAME)

        setContent {
            Column() {
                TopAppBar(title = { Text(text = "Nyimbo") })
                ScrollableColumn(Modifier.fillMaxWidth()
                    .padding(10.dp)) {
                    lyricsPageComposable(lyricsMap = songMap)
                }
            }
        }
    }
}

Как я могу получить контекст, чтобы передать его функции в основном действии? Из какого пространства имен Jetpack Compose он импортируется?

Я пробовал import android.content.Context, но для этого требуется инициализация, и я не могу понять, как это сделать.

Идея состоит в том, чтобы скопировать предварительно заполненную базу данных SQLite из каталога ресурсов в приложение при первом запуске.

0
Amani 27 Ноя 2020 в 17:01

1 ответ

Лучший ответ

Как я могу получить контекст, чтобы передать его функции в основном действии?

Там, где у вас есть этот вызов, используйте this. Activity - это Context.

В идеале этот код не был бы в действии - он был бы в репозитории или, в худшем случае, в модели представления, при этом фактический дисковый ввод-вывод выполнялся в фоновом потоке.

1
CommonsWare 27 Ноя 2020 в 14:08