database - 不能在 Room 中添加第二个视图参数?
问题描述
我使用了谷歌代码实验室: 链接
我想添加 2 个视图,而不是一个视图。我用 2 个参数创建了模型类等的所有内容,但我不明白如何将另一个参数放入主要活动和添加数据活动(Google 代码中的新词活动)。
还有没有任何示例房间代码尽可能少,它没有协程和回收器视图等,但只是在房间中保存一个整数?
数据模型类:
@Entity(tableName = "counter_table")
data class CounterBoxModel(
@PrimaryKey @ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "counter") val counter: Int
)
房间数据库:
// Annotates class to be a Room Database with a table (entity) of the CounterBoxModel class
@Database(entities = arrayOf(CounterBoxModel::class), version = 1, exportSchema = false)
abstract class CounterBoxRoomDatabase : RoomDatabase() {
abstract fun counterBoxDao(): CounterBoxDao
private class CounterBoxDatabaseCallback(
private val scope: CoroutineScope
) : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
INSTANCE?.let { database ->
scope.launch {
var counterBoxDao = database.counterBoxDao()
// Delete all content here.
counterBoxDao.deleteAll()
// Add sample Data.
var counterBoxModel = CounterBoxModel("Name", 100)
counterBoxDao.insert(counterBoxModel)
}
}
}
}
companion object {
@Volatile
private var INSTANCE: CounterBoxRoomDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): CounterBoxRoomDatabase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
CounterBoxRoomDatabase::class.java,
"counter_box_database"
)
.addCallback(CounterBoxDatabaseCallback(scope))
.build()
INSTANCE = instance
// return instance
instance
}
}
}
}
回收站视图适配器:
class CounterBoxRecyclerAdapter : ListAdapter<CounterBoxModel, CounterBoxRecyclerAdapter.CounterBoxViewHolder>(CounterBoxesComparator()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CounterBoxViewHolder {
return CounterBoxViewHolder.create(parent)
}
override fun onBindViewHolder(holder: CounterBoxViewHolder, position: Int) {
val current = getItem(position)
holder.bind(current.name, current.counter)
}
class CounterBoxViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val counterBoxNameView: TextView = itemView.findViewById(R.id.counter_name)
private val counterBoxCountView: TextView = itemView.findViewById(R.id.count)
fun bind(text: String?, number: Int?) {
counterBoxNameView.text = text
counterBoxCountView.text = number.toString()
}
companion object {
fun create(parent: ViewGroup): CounterBoxViewHolder {
val view: View = LayoutInflater.from(parent.context)
.inflate(R.layout.recyclerview_box, parent, false)
return CounterBoxViewHolder(view)
}
}
}
class CounterBoxesComparator : DiffUtil.ItemCallback<CounterBoxModel>() {
override fun areItemsTheSame(oldItem: CounterBoxModel, newItem: CounterBoxModel): Boolean {
return oldItem === newItem
}
override fun areContentsTheSame(oldItem: CounterBoxModel, newItem: CounterBoxModel): Boolean {
return oldItem.name == newItem.name
// but I have 2 items?
}
}
}
添加数据的活动:
无法在其中添加更多参数putExtra()
class NewCounterBoxActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new_counter_box)
save_button.setOnClickListener {
val replyIntent = Intent()
if (TextUtils.isEmpty(add_name.text) && TextUtils.isEmpty(add_count.text)) {
setResult(Activity.RESULT_CANCELED, replyIntent)
} else {
var name = add_name.text.toString()
var counter: String = add_count.text.toString()
replyIntent.putExtra(EXTRA_REPLY, name)
// will this work?
replyIntent.putExtra(EXTRA_REPLY, counter)
setResult(Activity.RESULT_OK, replyIntent)
}
finish()
}
}
companion object {
const val EXTRA_REPLY = "com.example.android.counterboxlistsql.REPLY"
}
}
参数问题的主要活动:
在主要活动的下面一行,它说没有为参数“计数器”传递值:
val name = CounterBoxModel(reply)
主要活动
class MainActivity : AppCompatActivity() {
private val newCounterBoxActivityRequestCode = 1
private val counterBoxViewModel: CounterBoxViewModel by viewModels {
CounterBoxViewModelFactory((application as CounterBoxApplication).repository)
}
var counterInt = 0
var expansion: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
boxes_panel.visibility = View.GONE
val adapter = CounterBoxRecyclerAdapter()
recycler_view.adapter = adapter
recycler_view.layoutManager = LinearLayoutManager(this)
// Add an observer on the LiveData returned by getAlphabetizedWords.
// The onChanged() method fires when the observed data changes and the activity is
// in the foreground.
counterBoxViewModel.allCounterBoxes.observe(owner = this) { words ->
// Update the cached copy of the words in the adapter.
words.let { adapter.submitList(it) }
}
add_box.setOnClickListener {
val intent = Intent(this@MainActivity, NewCounterBoxActivity::class.java)
startActivityForResult(intent, newCounterBoxActivityRequestCode)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, intentData: Intent?) {
super.onActivityResult(requestCode, resultCode, intentData)
if (requestCode == newCounterBoxActivityRequestCode && resultCode == Activity.RESULT_OK) {
intentData?.getStringExtra(NewCounterBoxActivity.EXTRA_REPLY)?.let { reply ->
val name = CounterBoxModel(reply)
counterBoxViewModel.insert(name)
}
} else {
Toast.makeText(
applicationContext, "Counter not saved because it is empty.",
Toast.LENGTH_LONG
).show()
}
}
}
}
解决方案
推荐阅读
- highcharts - 使用 boost 在大型热图中显示所有 y 标签 - Highcharts
- c# - 将 DataGrid 绑定到 ListView
- c++ - 在 Docker 中为 x86 主机上的 arm32v7 构建 libtorrent 失败并出现(错误:未知目标类型 EXE)
- django - Django - 在特定时间自动执行任务
- .net - 从 Web 浏览器使用客户端 Web 服务是一种好的做法吗?
- java - 内部连接器错误 (1002) - 调用线程在等待响应解除阻塞时超时
- c# - Xamarin Forms 4.8.0.x 媒体插件异步问题
- verilog - 七段显示器输出未知
- javascript - Nest 无法解析 AuthService 的依赖项(AuthRepository,?)
- docker - 从 docker-compose.yml 将参数传递到 docker 容器