Инициализировать базу данных, используя kotlin в AsyncTask - PullRequest
0 голосов
/ 26 ноября 2018

В моем doInBackground я объявляю и инициализирую db, я получил ошибку, которая говорит о несоответствии типов.Что я должен поставить вместо того, чтобы поставить this?

var dbHelper: MyDBHelper? = null
dbHelper = MyDBHelper(this)

Что я должен поставить, Там говорят Required: Context!

И это мой код задачи асинхронной, Эта проблема на dbHelper = MyDBHelper(this).

private class UpgradeDB(textView: TextView?) : AsyncTask<String, String, String>() {
        var innerTextView: TextView? = textView

        override fun onPreExecute() {
            innerTextView!!.visibility = View.VISIBLE
        }

        override fun doInBackground(vararg params: String): String? {
            val filename = "eBOSSInv_Upgrade.sql"
            val sdcard = Environment.getExternalStorageDirectory()
            val file = File(sdcard, filename)

            if (!file.exists()) isCancelled

            try {
                var dbHelper: MyDBHelper? = null

                dbHelper = MyDBHelper(this)

                dbHelper!!.writableDatabase.use { db ->
                    var intTotalLine = 0
                    var intLine = 1
                    BufferedReader(FileReader(file)).useLines { _ -> intTotalLine++ }
                    BufferedReader(FileReader(file)).use { r ->
                        r.lineSequence().forEach {
                            if (it.isNotEmpty()) {
                                db!!.execSQL(it)
                                publishProgress(String.format("Updating %s/%s records", intLine, intTotalLine))
                                intLine++
                            }
                        }
                    }
                }
            } catch (e: Exception) {

            }
            return null
        }

        override fun onProgressUpdate(vararg text: String) {
            innerTextView!!.text = text[0]
        }

        override fun onPostExecute(result: String?) {
            innerTextView!!.text = ""
        }

        override fun onCancelled() {

        }
    }

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вам нужно передать context в Async Task.

Пример:

llUpdate.setOnClickListener { 
       UpgradeDB(txtUpdate!!, getApplication()).execute("", "", "") 
}

Затем в UpgradeDB инициализировать контекст.

private class UpgradeDB(textView: TextView?, context: Context) : AsyncTask<String, String, String>() {
        var innerTextView: TextView? = textView
        var mContext:Context? = context // initialize context
    }

И наконец

dbHelper = MyDBHelper(mContext)
0 голосов
/ 26 ноября 2018

Это зависит от того, где вы пытаетесь создать этот объект.Если вы не сделаете это в классе, который расширяет Context (например, Activity), он не должен работать.Вы можете попробовать такую ​​конструкцию:

Есть два способа получить:

Более простой способ: объявить AsyncTask как внутренний класс внутри действия тура и ссылочный контекст, используя метку.Чтобы объявить класс внутренним, вам нужно поместить его в другой класс и добавить inner keyowrd:

class A {

    inner class B

}

Теперь вы можете ссылаться на контекст внутри вашей асинхронной задачи следующим образом:

dbHelper = DbHelper([ActivityName]@this)

Тем не менее, это простой способ вызвать утечку памяти, вы можете прочитать больше здесь: Утечки памяти Android AsyncTask

Лучший способ - извлечь AsyncTask в другой класс ипередать ему контекст приложения вместо Activity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...