#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)
}