如何使用TinyDB存储mutableListOf类型列表并解决报错及闪退问题
问题解决步骤
1. 初始参数报错根因
- 你调用的
putListString是专门用来存储List<String>类型的方法,你要存储的是自定义Todo类型的列表,方法类型不匹配 - 代码里
mutableListOf(todoList)是将整个todoList作为单个元素塞进新列表,生成了嵌套的List<List<Todo>>,类型完全不符合参数要求
2. 修改后闪退根因
- 自定义
Todo类未实现Serializable接口,TinyDB无法序列化自定义对象完成存储 - 调用
getListObject获取到的存储列表没有赋值给todoList,读操作完全没生效 - 存储时写了
arrayListOf(todoList),再次生成嵌套的List<List<Todo>>,下次读取时按List<Todo>解析会触发类型转换异常 - 未对
getListObject的返回值做判空处理,首次无存储数据时返回null会触发空指针异常
3. 正确实现代码
首先确保你的Todo类实现Serializable接口:
import java.io.Serializable data class Todo(val title: String, val isDone: Boolean) : Serializable
再修改业务逻辑代码:
val tinydb = TinyDB(this) // 读取存储的Todo列表,为空就用默认初始值 var todoList = tinydb.getListObject("TodoList", Todo::class.java)?.toMutableList() ?: mutableListOf(Todo("Write your first TODO statement", false)) val adapter = TodoAdapter(todoList) binding.rvTodos.adapter = adapter binding.rvTodos.layoutManager = LinearLayoutManager(this) binding.btnAddTodo.setOnClickListener { val title = binding.etTodo.text.toString() if (title.isEmpty()) return@setOnClickListener // 空输入过滤避免脏数据 val todo = Todo(title, false) todoList.add(todo) // 直接传todoList转ArrayList即可,不要嵌套包装 tinydb.putListObject("TodoList", ArrayList(todoList)) adapter.notifyItemInserted(todoList.size - 1) // 可选:输入完成后清空输入框 binding.etTodo.text.clear() }
内容的提问来源于stack exchange,提问作者Shagufta
相关产品推荐
相关产品推荐

