Вылетает приложение при заходе на определенную Activity
Разрабатываю приложение для учета семейных финансов, столкнулся с проблемой, что у меня вылетает приложение при заходе на ActivityHis. Предполагаю, что проблема связана с моим DbHelper'ом, хоть и не уверен. Пользователь должен авторизоваться и перейти на вкладки с расходом и доходом, внести данные, которые попадают в бд (это работает), а затем может перейти на ActivityHis и увидеть список, реализованный через RecyclerView, где будут отображаться как расходы, так и доходы. Код ActivityHis
class ActivityHis : AppCompatActivity() {
private lateinit var historyList: RecyclerView
private lateinit var historyAdapter: HistoryAdapter
private lateinit var dbHelper: DbHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_his)
// Создание экземпляра DbHelper
dbHelper = DbHelper(this, null)
// Настройка кнопки "Назад"
val buttonBack: Button = findViewById(R.id.button_back)
buttonBack.setOnClickListener {
finish()
}
// Настройка RecyclerView
historyList = findViewById(R.id.history_list)
historyAdapter = HistoryAdapter(this, getHistoryData())
historyList.adapter = historyAdapter
historyList.layoutManager = LinearLayoutManager(this)
}
private fun getHistoryData(): List<History> {
// Получение данных из базы данных через DbHelper
return dbHelper.getHistoryData()
}
}
Код DbHelper:
class DbHelper(context: Context, factory: SQLiteDatabase.CursorFactory?) :
SQLiteOpenHelper(context, "app.db", factory, 1) {
override fun onCreate(db: SQLiteDatabase?) {
val query =
"CREATE TABLE IF NOT EXISTS users (_id INTEGER PRIMARY KEY AUTOINCREMENT, login TEXT, pass TEXT)"
db!!.execSQL(query)
val queryIncome =
"CREATE TABLE IF NOT EXISTS incomes (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, doh_desc TEXT, doh_sum REAL, date DATE, time TIME)"
db.execSQL(queryIncome)
val queryExpenses =
"CREATE TABLE IF NOT EXISTS expenses (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, rash_desc TEXT, rash_sum REAL, date DATE, time TIME)"
db.execSQL(queryExpenses)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db!!.execSQL("DROP TABLE IF EXISTS users")
db.execSQL("DROP TABLE incomes")
onCreate(db)
}
fun addUser(user: User): Boolean {
val values = ContentValues()
values.put("login", user.login)
values.put("pass", user.pass)
val db = this.writableDatabase
db.insert("users", null, values)
return true
}
fun getUser(login: String, pass: String): Boolean {
val db = this.readableDatabase
val result =
db.rawQuery("SELECT * FROM users WHERE login = '$login' AND pass = '$pass'", null)
return result.moveToFirst()
}
fun addIncome(doh: Doh) {
val values = ContentValues()
values.put("user_id", doh.userId)
values.put("doh_desc", doh.doh_desc)
values.put("doh_sum", doh.doh_sum)
values.put("date", doh.date)
values.put("time", doh.time)
val db = this.writableDatabase
db.insert("incomes", null, values)
}
fun addRash(rash: Rash) {
val values = ContentValues()
values.put("user_id", rash.userId)
values.put("rash_desc", rash.rash_desc)
values.put("rash_sum", rash.rash_sum)
values.put("date", rash.date)
values.put("time", rash.time)
val db = this.writableDatabase
db.insert("expenses", null, values)
}
@SuppressLint("Range")
fun getHistoryData(): List<History> {
// Получение данных из базы данных
val db = this.readableDatabase
val cursor = db.rawQuery(
"SELECT * FROM (SELECT * FROM expenses UNION ALL SELECT * FROM incomes) ORDER BY date DESC",
null
)
val historyList = mutableListOf<History>()
while (cursor.moveToNext()) {
val id = cursor.getInt(cursor.getColumnIndex("_id"))
val desc = cursor.getString(cursor.getColumnIndex("rash_desc"))
val sum = cursor.getDouble(cursor.getColumnIndex("rash_sum"))
val date = cursor.getString(cursor.getColumnIndex("date"))
val time = cursor.getString(cursor.getColumnIndex("time"))
val type = if (cursor.getInt(cursor.getColumnIndex("user_id")) == 0) 0 else 1
val history = History(id, desc, sum, date, time, type)
historyList.add(history)
}
cursor.close()
return historyList
}
}
Код класса History
data class History(
val id: Int,
val desc: String,
val sum: Double,
val date: String,
val time: String, // Добавьте параметр time
val type: Int
)
И код HistoryAdapter:
class HistoryAdapter(
private val context: Context,
private val historyList: List<History>
) : RecyclerView.Adapter<HistoryAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.history_list, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val history = historyList[position]
holder.nameTextView.text = history.id.toString() //
holder.descriptionTextView.text = history.desc //
holder.amountTextView.text = history.sum.toString()
val color = if (history.type == 0) Color.RED else Color.GREEN
holder.amountTextView.setTextColor(color)
val drawable = if (history.type == 0) R.drawable.up_arrow_svgrepo_com else R.drawable.down_arrow_svgrepo_com
holder.iconImageView.setImageResource(drawable)
}
override fun getItemCount(): Int {
return historyList.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val nameTextView: TextView = itemView.findViewById(R.id.name_text_view)
val descriptionTextView: TextView = itemView.findViewById(R.id.description_text_view)
val amountTextView: TextView = itemView.findViewById(R.id.amount_text_view)
val iconImageView: ImageView = itemView.findViewById(R.id.icon_image_view)
}
}