首页 > 解决方案 > 不能在 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()
            }
        }
}
}

标签: databaseandroid-studioandroid-room

解决方案


推荐阅读