abstract fun AddressDao(): AddressDao?
Почему это допускает значение null?
val favoriteData: List<Table>?
Почему это допускает значение null?
fun addData(favoriteList: Table?)
Почему это допускает значение NULL?
fun delete(favoriteList: Table?)
Почему это допускает значение NULL?
Типизированное значение NULL позволяет вам представить, где данное значение может быть нулевым, в том смысле, что имеет смысл его отсутствовать .
Ни один из вышеперечисленных случаев не соответствует подобному сценарию. Room никогда не вернет вам null
вместо фактического dao
.
Kotlin - это пустая безопасность, позволяющая вам исключить возможные случаи ошибок, сделав его частью системы типов, этого не должно быть. t использоваться для создания таких «ложных» случаев ошибок. Если вы пытаетесь добавить null
в базу данных вместо реального объекта, у вас, вероятно, есть ошибка в вашем коде, и Kotlin должен помочь вам устранить эту возможность.
Что касается вашего фактического вопроса, вы неправильно используете Room.
.allowMainThreadQueries()
- это способ отключить проверку ошибок, но эта ошибка возникает не просто так. Вы не должны читать данные в потоке пользовательского интерфейса, потому что при достаточном количестве данных ваше приложение зависнет (ANR).
Предполагается, что код будет выглядеть примерно так:
@Entity(tableName = "address")
class Address {
@PrimaryKey
var id = 0
@ColumnInfo(name = "address")
var address: String? = null
}
База данных: -
@Database(entities = [Address::class], version = 1)
abstract class Database : RoomDatabase() {
abstract fun addressDao(): AddressDao
}
AddressDao:
@Dao
interface AddressDao {
@Insert
suspend fun addData(address: Address)
@Query("select * from address")
fun getAddressesWithChanges(): LiveData<List<Address>>
@Query("SELECT EXISTS (SELECT 1 FROM address WHERE id=:id)")
suspend fun isAddressAdded(id: Int): Int
@Delete
suspend fun delete(address: Address)
}
class CustomApplication: Application() {
lateinit var database: Database
private set
lateinit var addressDao: AddressDao
private set
override fun onCreate() {
super.onCreate()
this.database = Room.databaseBuilder<Database>(
applicationContext,
Database::class.java, "database"
).build()
addressDao = database.addressDao()
}
}
AndroidManifest. xml
<application android:name=".CustomApplication"
...
Активность адреса:
import androidx.lifecycle.observe
class AddressActivity : AppCompatActivity() {
private val adapter = AddressAdapter()
private lateinit var data: LiveData<List<Address>>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.address_activity)
findViewById<View>(R.id.addButton).setOnClickListener {
val intent = Intent(this, AddAddressActivity::class.java)
startActivity(intent)
}
val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
recyclerView.adapter = adapter
val application = application as CustomApplication
val addressDao = application.addressDao
data = addressDao.getAddressesWithChanges()
data.observe(this) {
adapter.updateData(it)
}
}
}
AddressAdapter:
class AddressAdapter: RecyclerView.Adapter<AddressAdapter.ViewHolder>() {
private var addresses: List<Table> = Collections.emptyList()
override fun onCreateViewHolder(viewGroup: ViewGroup, itemViewType: Int): ViewHolder =
ViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.address_item, viewGroup, false))
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
val address = addresses[position]
viewHolder.tv.setText(address.address)
}
override fun getItemCount(): Int = addresses.size
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val tv = itemView.findViewById(R.id.ftv_name)
}
fun updateData(addresses: List<Address>) {
this.addresses = addresses
notifyDataSetChanged() // TODO: use ListAdapter if animations are needed
}
}
AddAddress activity: -
class AddAddressActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.addaddress)
val editText: EditText = findViewById(R.id.longaddress)
val application = application as CustomApplication
val addressDao = application.addressDao
saveaddress.setOnClickListener {
val address = Address()
address.address = editText.getText().toString()
lifecycleScope.launch {
addressDao.addData(address)
finish()
}
}
}
}
Вы также можете использовать https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#6