Проблема с обработчиком базы данных приводит к сбою приложения (kotlin)

#java #android #database #kotlin

#java #Android #База данных #kotlin

Вопрос:

Я создаю приложение, которое позволяет добавлять элементы в список внутри фрагмента. теперь каждый раз, когда компилятор обращается к функции вызова обработчика базы данных, приложение отключается, и я не могу найти причину. shopping_list.kt

 package com.example.pricetag.fragments

import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import com.example.pricetag.R
import com.example.pricetag.fragments.DTO.ItemList
import kotlinx.android.synthetic.main.fragment_shopping_list.*

class shopping_list : Fragment() {

    lateinit var dbHandler: DBHandler

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        var view = inflater.inflate(R.layout.fragment_shopping_list, container, false)
        val addItem_button = view.findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(R.id.fab_shoppiglist)
        addItem_button.setOnClickListener {
            val dialog = AlertDialog.Builder(getContext())
            val tempView = layoutInflater.inflate(R.layout.dialog_shoppinglist,null)
            val text_result = tempView.findViewById<EditText>(R.id.et_Itemlist)
            dialog.setView(tempView)
            dialog.setPositiveButton("Add") { _: DialogInterface, _: Int ->
                if (text_result.text.isNotEmpty()) {
                    val itemList = ItemList()
                    itemList.name = text_result.text.toString()
                    dbHandler.addItem(itemList)
                }
            }
            dialog.setNegativeButton("Cancel"){ _: DialogInterface, _: Int->

            }
            dialog.show()
        }

        return view
    }

    private fun refreshList(){
        rv_shoppinglist.adapter = ShoppinglistAdpter(this.requireContext(),dbHandler.getItem())
    }


    class ShoppinglistAdpter(val context: Context, val list: MutableList<ItemList>): RecyclerView.Adapter<ShoppinglistAdpter.ViewHolder>(){
        class ViewHolder(v : View) : RecyclerView.ViewHolder(v){
            val itemName : TextView = v.findViewById(R.id.tv_item_name)
        }

        override fun onCreateViewHolder(p0: ViewGroup, pl: Int): ViewHolder {
            return ViewHolder(LayoutInflater.from(context).inflate(R.layout.rv_child_shoppinglist,p0))
        }

        override fun getItemCount(): Int {
            return list.size
        }

        override fun onBindViewHolder(holder: ViewHolder, p1: Int) {
            holder.itemName.text = list[p1].name
        }

    }

}
  

DBHandler.kt

 package com.example.pricetag.fragments

import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.util.Log
import com.example.pricetag.fragments.DTO.ItemList

class DBHandler(val context: Context) : SQLiteOpenHelper(context, DB_NAME,null, DB_VERSION){
    override fun onCreate(db: SQLiteDatabase){
        val createItemTable = "CREATE TABLE $TABLE_ITEMS ("  
                "$COL_ID integer PRIMARY KEY AUTOINCREMENT,"  
                "$COL_NAME varchar,"  
                "$COL_AMOUNT integer);"
        db.execSQL(createItemTable)
    }

    override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {

    }

    fun addItem(itemList : ItemList) : Boolean {
        Log.i("Err","#9")
        val db = writableDatabase
        val cv = ContentValues()
        cv.put(COL_NAME, itemList.name)
        val result = db.insert(TABLE_ITEMS, null, cv)
        return result != (-1).toLong()
    }

    fun getItem() : MutableList<ItemList>{
        val result : MutableList<ItemList> = ArrayList()
        val db : SQLiteDatabase = readableDatabase
        val queryResult = db.rawQuery("SELECT * from $TABLE_ITEMS", null)
        if(queryResult.moveToFirst()){
            do{
                val itemList = ItemList()
                itemList.id = queryResult.getLong(queryResult.getColumnIndex(COL_ID))
                itemList.name = queryResult.getString(queryResult.getColumnIndex(COL_NAME))
                itemList.amount = queryResult.getInt(queryResult.getColumnIndex(COL_AMOUNT))
                result.add(itemList)
            } while(queryResult.moveToNext())
        }

        return result
    }
}
  

ItemList.kt

 package com.example.pricetag.fragments.DTO

class ItemList {
    var id: Long = -1
    var name: String = ""
    var amount = 0


}
  

Const.kt

 package com.example.pricetag.fragments

const val DB_NAME = "ItemList"
const val DB_VERSION = 1
const val TABLE_ITEMS = "Items"
const val COL_ID = "id"
const val COL_NAME = "name"
const val COL_AMOUNT = "amount"
  

пожалуйста, помогите мне найти проблему и ofc решение.
ценю это. хорошего дня

редактировать: это журнал сбоев (ошибка

 2020-08-28 03:42:23.932 6619-6619/com.example.pricetag E/RecyclerView: No adapter attached; skipping layout
2020-08-28 03:42:26.710 6619-6619/com.example.pricetag E/RecyclerView: No adapter attached; skipping layout
2020-08-28 03:42:26.740 6619-6619/com.example.pricetag E/RecyclerView: No adapter attached; skipping layout
2020-08-28 03:42:30.059 6619-6619/com.example.pricetag E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pricetag, PID: 6619
    kotlin.UninitializedPropertyAccessException: lateinit property dbHandler has not been initialized
        at com.example.pricetag.fragments.shopping_list.getDbHandler(shopping_list.kt:20)
        at com.example.pricetag.fragments.shopping_list$onCreateView$1$1.onClick(shopping_list.kt:38)
        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
  

и это журнал сбоев (отладка):

 2020-08-28 03:42:30.059 6619-6619/com.example.pricetag E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pricetag, PID: 6619
    kotlin.UninitializedPropertyAccessException: lateinit property dbHandler has not been initialized
        at com.example.pricetag.fragments.shopping_list.getDbHandler(shopping_list.kt:20)
        at com.example.pricetag.fragments.shopping_list$onCreateView$1$1.onClick(shopping_list.kt:38)
        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
  

Комментарии:

1. Пожалуйста, включите журнал сбоев из logcat. Это добавит ценную информацию о том, что происходит в вашем приложении во время сбоя.

Ответ №1:

код инициализации здесь не включен. например)

 onCreateView(){
...
dbHandler = DBHandler(getActivity())
...
}