Android / Kotlin: как создать класс, который использует класс DBLocal? Сообщение об ошибке: несоответствие типа требует контекста

#android #database #kotlin

#Android #База данных #kotlin

Вопрос:

Я хотел бы создать общий класс БД, который управляет локальной БД и другой БД. У меня ошибка, но я не понимаю, в чем проблема…

Общий класс:

 class DBHandler {
    companion object {
        val sharedInstance = DBHandler() //gérer si sharedinstance est null pour éviter pb d'ecriture
    }

    fun methodToSelectData(strQuery: String, dataBase: String)/*, completion: @escaping (_ result:*/
    {
        print(message = strQuery)

        val dbLocal = DBLocal(this, null, null, 1) //pb on this line
        dbLocal.methodToSelectData(strQuery)
    }
}
  

Класс DB:

 class DBLocal(context: Context, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int) : SQLiteOpenHelper(context, DATABASE_NAME, factory, DATABASE_VERSION)
{

    override fun onCreate(db: SQLiteDatabase)
    {
        print(DATABASE_NAME)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int)
    {

    }
    fun methodToSelectData(strQuery: String)/*, completion: @escaping (_ result:*/
    {

    }

    fun methodToInsertUpdateDeleteData(strQuery: String)/*, completion: @escaping (_ result: Bool) -> Void)*/
    {

    }
    companion object {
        private val DATABASE_VERSION = 1
        private val DATABASE_NAME = "Local.db"
    }
}
  

Заранее спасибо.

Комментарии:

1. Где вы используете methodToSelectData метод? В activity / fragment?

Ответ №1:

 class DBLocal(
    context: Context,
    name: String?,
    factory: SQLiteDatabase.CursorFactory?,
    version: Int
) : SQLiteOpenHelper(context, DATABASE_NAME, factory, DATABASE_VERSION) {

}
  

Проблема: класс DBLocal получает контекст в качестве первого параметра, но при вызове его из класса DBHandler.

 val dbLocal = DBLocal(this, null, null, 1) //pb on this line
  

Вы передаете this как класс DBLocal, который не является контекстом подклассов класса Context. Вот почему ваше приложение выдает ошибку.

Сообщение об ошибке: несоответствие типа требует контекста

Решение: Простое решение — передать контекст в метод, который требует контекста для выполнения задания.

 fun methodToSelectData(context: Context, strQuery: String, dataBase: String)/*, completion: @escaping (_ result:*/ {
    print(message = strQuery)

    val dbLocal = DBLocal(context, null, null, 1) //pb on this line
    dbLocal.methodToSelectData(strQuery)
}
  

И передавайте контекст при вызове DBHandler, например, в activity или service.

 DBHandler.sharedInstance.methodToSelectData(this, "your query", "dataBase")
  

Ответ №2:

Вы можете задать контекст для methodToSelectData

 fun methodToSelectData(context : Context, strQuery: String, dataBase: String)/*, completion: @escaping (_ result:*/
{
    print(message = strQuery)

    val dbLocal = DBLocal(context, null, null, 1) //pb on this line
    dbLocal.methodToSelectData(strQuery)
}