IsInitialized не вызывается в Kotlin - PullRequest
0 голосов
/ 15 марта 2020

У меня нет ошибок в журналах, но я не могу запустить отладчик внутри моего if(::db.isinitialized) condition

Пожалуйста, смотрите мои коды ниже:

MainActivity

class MainActivity : AppCompatActivity() {

    lateinit var db: DatabaseCommon;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        if(::db.isInitialized) {
            val dbVersion = DatabaseCommon.myInstance.dbVersion;
            val dbName = DatabaseCommon.myInstance.dbName;
            val tableName = DatabaseCommon.myInstance.tableName;
            val name: String = DatabaseCommon.myInstance.name;
            val age: String = DatabaseCommon.myInstance.age;

            try{
                val db = this.openOrCreateDatabase(dbName, Context.MODE_PRIVATE, null)
                var query = "CREATE TABLE IF NOT EXISTS  ${tableName} (${name} VARCHAR, ${age} INT(2))";
                db.execSQL(query)

                query = "INSERT INTO ${tableName} (${name}, ${age}) VALUES ('James', 20)";
                db.execSQL(query);

                Toast.makeText(applicationContext, "CREATED", Toast.LENGTH_LONG);
            }catch(e: Exception) {
                e.printStackTrace();
            }
        }
    }
}

DatabaseCommon

class DatabaseCommon {

    val dbVersion: Int = 1;
    val dbName: String = "db_munsicians";

    val tableName: String = "musicians"
    val name: String = "name";
    var age: String = "age";

    private constructor() {}

    companion object {
        private lateinit var instance: DatabaseCommon;

        val myInstance: DatabaseCommon
            get() {
                if (instance == null) {
                    instance = DatabaseCommon();
                }
                return instance;
            }
    }

    fun returnDbClass() {
        println("I was called");
    }
}

Если я не поставлю if(::db.isinitialized), я получаю сообщение об ошибке: lateinit не был инициализирован. Пожалуйста, помогите мне узнать Kotlin, помогая мне решить эту проблему. Спасибо.

1 Ответ

1 голос
/ 15 марта 2020

Вы не можете проверить, не инициализирована ли instance, используя instance == null check. Когда вы пытаетесь сравнить instance с null, вы пытаетесь получить значение instance, но оно не инициализируется, поскольку выдает исключение.

Для вашего случая вы должны использовать ленивое свойство вместо латинитного. Вы можете реализовать это так:

private val instance: Lazy<DatabaseCommon> = lazy { DatabaseCommon() }

val myInstance: DatabaseCommon
    get() = instance.value

или так:

val myInstance: Lazy<DatabaseCommon> = lazy { DatabaseCommon() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...