【发布时间】:2020-06-21 13:17:36
【问题描述】:
我使用 Room 和 Flows 制作了一个简单的示例应用程序:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val build = Room.databaseBuilder(this, FinanceDatabase::class.java, "database.db")
.fallbackToDestructiveMigration()
.build()
GlobalScope.launch {
build.currencyDao().addCurrency(CurrencyLocalEntity(1))
val toList = build.currencyDao().getAllCurrencies().toList()
Log.d("test", "list - $toList")
}
}
}
@Entity(tableName = "currency")
data class CurrencyLocalEntity(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "currencyId")
var id: Int
) {
constructor() : this(-1)
}
@Dao
interface CurrencyDao {
@Query("SELECT * FROM currency")
fun getAllCurrencies(): Flow<CurrencyLocalEntity>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun addCurrency(currency: CurrencyLocalEntity)
}
@Database(entities = [CurrencyLocalEntity::class], version = 1)
abstract class FinanceDatabase : RoomDatabase() {
abstract fun currencyDao(): CurrencyDao
}
我想在上面的代码中使用toList() 函数,但是出现了问题,甚至 Log 也无法打印。同时使用collect() 可以正常工作并给我所有记录。
任何人都可以向我解释什么是错的吗?谢谢。
【问题讨论】:
-
examples in the documentation 建议当您想从产生多个项目的查询中返回
Flow时,应使用Flow<List<T>>。返回Flow<T>的示例用于返回单个项目的查询。您的getAllCurrencies()期望 Room 为currency表中的每个项目发出。我不认为它支持这一点。
标签: android android-room kotlin-coroutines kotlin-flow