我有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”表发生任何更改,则此查询与其他任何常规对象查询一样会发出对象。