代码之家  ›  专栏  ›  技术社区  ›  Ibanez1408

Kotlin中未调用IsInitialized

  •  0
  • Ibanez1408  · 技术社区  · 5 年前

    我的日志中没有错误,但无法在 if(::db.isinitialized) condition

    主要活动

    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();
                }
            }
        }
    }
    

    数据库公用

    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的错误尚未初始化。请帮我解决这个问题,帮助我学习科特林。谢谢您。

    1 回复  |  直到 5 年前
        1
  •  1
  •   ardenit    5 年前

    你不能检查 instance 未使用初始化 instance == null 检查一下。当你试图比较 实例 null ,您尝试获取 实例

    对于你的情况,你应该使用 lazy property 而不是迟到一次。你可以这样实现它:

    private val instance: Lazy<DatabaseCommon> = lazy { DatabaseCommon() }
    
    val myInstance: DatabaseCommon
        get() = instance.value
    

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