4

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()が、何か問題が発生し、ログでさえ印刷されません。同時に、使用collect()すると正常に動作し、すべてのレコードが得られます。

誰が私に何が悪いのか説明できますか? ありがとう。

4

4 に答える 4

1

Room のフローは、テーブルの変化を観察するためのものです。

どの行が変更されたかに関係なく、テーブルに変更が加えられるたびに、クエリが再トリガーされ、フローが再び発行されます。

ただし、データベースのこの動作は、関連のない行を更新すると、フローが再び出力され、同じ結果になることも意味します。SQLite データベース トリガーはテーブル レベルでのみ通知を許可し、行レベルでは許可しないため、Room はテーブル データで正確に何が変更されたかを知ることができません。

于 2020-06-22T06:00:27.163 に答える