Android / Kotlin: как создать класс, который использует класс DBLocal? Сообщение об ошибке: Несоответствие типов требует контекста - PullRequest
1 голос
/ 04 апреля 2019

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

Общий класс:

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"
    }
}

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

Ответы [ 2 ]

1 голос
/ 05 апреля 2019
class DBLocal(
    context: Context,
    name: String?,
    factory: SQLiteDatabase.CursorFactory?,
    version: Int
) : SQLiteOpenHelper(context, DATABASE_NAME, factory, DATABASE_VERSION) {

}

Проблема: Класс DBLocal получает Context в качестве первого параметра, но при вызове его из класса 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, например, в действии или службе.

DBHandler.sharedInstance.methodToSelectData(this, "your query", "dataBase")
1 голос
/ 04 апреля 2019

Вы можете задать контекст для 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...