Null при добавлении данных в SQLite - PullRequest
0 голосов
/ 14 января 2019

Я попытался добавить данные в SQLite после this . Тем не менее, я получаю null, когда я добавляю данные

DatabaseHandler.kt

override fun onCreate(db: SQLiteDatabase) {
    val CREATE_TABLE = "CREATE TABLE $TABLE_NAME (" +
            ID + " INTEGER PRIMARY KEY," +
            NAME + " TEXT," + DESC + " TEXT," +
            COMPLETED + " TEXT);"
    db.execSQL(CREATE_TABLE)
}

fun addTask(validasi: Validasi): Boolean {
    val db = this.writableDatabase
    val values = ContentValues()
    values.put(NAME, validasi.name)
    values.put(DESC, validasi.desc)
    val _success = db.insert(TABLE_NAME, null, values)
    db.close()
    return (Integer.parseInt("$_success") != -1)
}
 override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    val DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME
    db.execSQL(DROP_TABLE)
    onCreate(db)
}

companion object {

    private val DB_VERSION = 1
    private val DB_NAME = "MyTasks"
    private val TABLE_NAME = "Tasks"
    private val ID = "Id"
    private val NAME = "Name"
    private val DESC = "Desc"
    private val COMPLETED = "Completed"
}

ResultActivity.kt

class ResultActivity : AppCompatActivity() {

var dbHandler: DatabaseHandler? = null

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

    button_save.setOnClickListener(){
        var success: Boolean = false
        val validasi: Validasi = Validasi()
        validasi.name = "1"
        validasi.desc = "1"
        validasi.completed = "y"
        Toast.makeText(this@ResultActivity, ""+validasi.name, Toast.LENGTH_SHORT).show()

        success = dbHandler?.addTask(validasi) as Boolean

        if (success)
            finish()
    }
}

но когда я нажимаю кнопку, приложение останавливается и журнал говорит

FATAL EXCEPTION: main
Process: com.wahanaartha.supervisionline, PID: 930
kotlin.TypeCastException: null cannot be cast to non-null type kotlin.Boolean
    at ResultActivity

Что происходит в этой строке: success = dbHandler?.addTask(validasi) as Boolean

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Похоже, что основная проблема, которую вы не инициализируете dbHandler. Поэтому это ноль.

Инициализируйте его, например, в методе onCreate. Лучший подход - ввести зависимости.

В вашем случае вы можете попробовать это

fun initDependencies() {
   dbHandler = DatabaseHandler(this@ResultActivity);
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_result)
    initDependencies();
    button_save.setOnClickListener(){
        var success: Boolean = false
        val validasi: Validasi = Validasi()
        validasi.name = "1"
        validasi.desc = "1"
        validasi.completed = "y"
        Toast.makeText(this@ResultActivity, ""+validasi.name, Toast.LENGTH_SHORT).show()

        success = dbHandler?.addTask(validasi) as Boolean

        if (success)
            finish()
    }
}

Попробуйте, это должно работать. Конечно, если у вас есть аргументы конструктора, они должны быть предоставлены при создании экземпляра DatabaseHandler.

Также прочитайте ответ Zoe, он содержит важную информацию для понимания. Вы должны лучше изучить базовую языковую структуру и инфраструктуру AndroidSDK перед написанием приложения.

0 голосов
/ 14 января 2019

Вы никогда не инициализируете dbHandler - это нулевое значение, когда вы вызываете метод. Нулевые безопасные вызовы предотвращают NPE, но я предполагаю, что вы просто забыли инициализировать его.

Если вы этого не сделали, но вас интересует сама ошибка, вам прежде всего необходимо понять, что она делает:

dbHandler?. // if dbHandler != null
    addTask(validasi) // call method
    as Boolean // and cast as non-null bool

Теперь, это было бы хорошо, если бы вы не использовали обнуляемый вызов. Поскольку dbHandler никогда не инициализируется, выражение эквивалентно:

null as Boolean

Вы не можете привести ноль к ненулевому типу. Изменение его на Boolean? заставит его работать, но вам также придется изменить выражение if на явный if(success == true).

Вы должны сделать это в любом случае; но инициализация dbHandler сделает многое. Если вы не инициализируете его до onCreate метода, вы можете вместо этого сделать его lateinit var, что также позволит вам использовать ненулевой тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...