我有2个实体,Coin和CoinRevenue。

基本上,硬币持有其他某种货币的美元价格。

例如,代号为EUR的硬币的值为1.0356

@Entity(tableName = "coin")
data class Coin(
        @field:PrimaryKey(autoGenerate = false)
        var id: String = "",
        var symbol: String = "",
        var pricInUsd: Float = 0f)

CoinRevenue是一个实体,我用来保存用户拥有的特定硬币中的多少硬币。
例如,CoinRevenue与具有EUR符号且金额为1000的Coin Entity有关联。
@Entity(tableName = "coinRevenue")
    data class CoinRevenueNew(
            @field:PrimaryKey(autoGenerate = true)
            var id: Int = 0,
            var coin: Coin? = null,
            var amount: Float = 0f)

现在,我想从数据库中获取CoinRevenue并从数据库中获取更新的Coin。

例如,我将硬币保存为(EUR,1.0253)
然后用该硬币保存了CoinRevenue。

之后,我用(EUR,2.522)更新了硬币
我希望CoinRevenue中的Coin对象也将被更新。

我知道@Embedded只是将内部对象字段作为列添加到同一父对象。
当我使用关系时,我必须使用列表或集合。
但是我的CoinRevenue里总是有1个Coin。

我的coinDAO:
@Query("select * from coin order by rank")
fun getAllCoins(): Flowable<List<CoinDB>>

@Query("select * from coin where rank = 1")
fun getFirstCoin(): Maybe<CoinDB>

@Query("select * from coin where favourite = 1 order by rank")
fun getAllFavouriteCoins(): Flowable<List<CoinDB>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertCoin(coinDB: CoinDB)

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertCoins(coinsList: List<CoinDB>)

// -----------------
// CoinRevenue
// -----------------

@Query("select * from coinRevenue order by rank")
fun getAllCoinsRevenue(): Flowable<List<CoinRevenue>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertCoinRevenue(coinRevenue: CoinRevenue)

@Delete()
fun deleteCoinRevenue(coinRevenue: CoinRevenue)

创造此效果的最佳方法是什么?

最佳答案

因此,经过大量尝试,我设法使其正常运行。

我更改了CoinRevenue对象以持有Coin ID的外键

@Entity(tableName = "coinRevenue", foreignKeys = (arrayOf(ForeignKey(
        entity = CoinDB::class,
        onUpdate = ForeignKey.CASCADE,
        parentColumns = arrayOf("coinId"),
        childColumns = arrayOf("coinDbId"))))
)
data class CoinRevenue(
        @ColumnInfo(name = "mid")
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0L,
        @ColumnInfo(name = "coinDbId")
        var coinDbId: String? = null,
        @ColumnInfo(name = "amount")
        var amount: Double = 0.toDouble()
)

我需要使用两个对象创建一个POJO,如下所示:
class CoinRevenueWithCoin() : Parcelable {
@Embedded lateinit var coinDB: CoinDB
@Embedded lateinit var coinRevenue: CoinRevenue
}

并像这样查询:
@Query("select * from coinRevenue, coin where coinRevenue.coinDbId = coin.coinId order by coin.rank")
fun getAllCoinsRevenueWithCoin(): Flowable<List<CoinRevenueWithCoin>>

而已。

另外,如果“coin”表或“coinRevenue”表发生任何更改,则此查询与其他任何常规对象查询一样会发出对象。

10-06 01:40