【问题标题】:RealmPrimaryKeyConstraintException on updating objects in RealmRealmPrimaryKeyConstraintException 更新领域中的对象
【发布时间】:2018-10-23 18:04:44
【问题描述】:

我有以下型号:

购物车对象

open class Cart(
        @PrimaryKey
        var id: String? = null,

        var orders: RealmList<Deal> = RealmList()
) : RealmObject()

交易对象

open class Deal(

        @field:SerializedName("short_description")
        var shortDescription: String? = null,

        @field:SerializedName("original_price")
        var originalPrice: Int? = null,

        @field:SerializedName("deal_category")
        var dealCategory: DealCategory? = null,

        @field:SerializedName("images")
        var images: RealmList<Image>? = null,

        @field:SerializedName("featured")
        var featured: String? = null,

        @field:SerializedName("deal_type")
        var dealType: DealType? = null,

        @field:SerializedName("deal_of_day")
        var dealOfDay: String? = null,

        @field:SerializedName("restaurant")
        var restaurant: Restaurant? = null,

        @field:SerializedName("expiry_date")
        var expiryDate: String? = null,

        @field:SerializedName("description")
        var description: String? = null,

        @field:SerializedName("page_views")
        var pageViews: Int? = null,

        @field:SerializedName("price")
        var price: Int? = null,

        @field:SerializedName("name")
        var name: String? = null,

        @field:SerializedName("alias")
        var alias: String? = null,

        @field:SerializedName("links")
        var links: RealmList<Link>? = null,

        @field:SerializedName("id")
        var id: Int? = null,

        @field:SerializedName("user")
        var user: User? = null,

        @field:SerializedName("status")
        var status: String? = null
): RealmObject()

餐厅对象

open class Restaurant(

        @field:SerializedName("location_address")
        var locationAddress: String? = null,

        @field:SerializedName("website")
        var website: String? = null,

        @field:SerializedName("featured")
        var featured: String? = null,

        @field:SerializedName("latitude")
        var latitude: String? = null,

        @field:SerializedName("opening_time")
        var openingTime: String? = null,

        @field:SerializedName("description")
        var description: String? = null,

        @field:SerializedName("created_at")
        var createdAt: String? = null,

        @field:SerializedName("updated_at")
        var updatedAt: String? = null,

        @field:SerializedName("phone")
        var phone: String? = null,

        @field:SerializedName("closing_time")
        var closingTime: String? = null,

        @field:SerializedName("name")
        var name: String? = null,

        @field:SerializedName("preparation_time")
        var preparationTime: Int? = null,

        @field:SerializedName("alias")
        var alias: String? = null,

        @PrimaryKey
        @field:SerializedName("id")
        var id: Int? = null,

        @field:SerializedName("ideal_class")
        var idealClass: String? = null,

        @field:SerializedName("email")
        var email: String? = null,

        @field:SerializedName("status")
        var status: String? = null,

        @field:SerializedName("longitude")
        var longitude: String? = null
) : RealmObject()

当我最初将优惠添加到购物车时,一切正常,但是当我将优惠添加到已经存在餐厅条目的购物车时,我得到了RealmPrimaryKeyConstraintException。我的方法如下:

Realm.getInstance(RealmUtil.realmConfiguration).use {realm ->
            var cart = realm.where<Cart>().findFirst()

            realm.executeTransaction {
                if (cart == null) {
                    cart = Cart().apply {
                        id = getString(R.string.app_name)
                        orders.add(deal)
                    }
                } else {
                    cart!!.orders.add(deal)
                }

                it.copyToRealmOrUpdate(cart!!)

                invalidateOptionsMenu()
            }
        }

我得到的错误是:

io.realm.exceptions.RealmPrimaryKeyConstraintException: Primary key value already exists: 43 .
    (/Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsObject.cpp:197)
        at io.realm.internal.OsObject.nativeCreateNewObjectWithLongPrimaryKey(Native Method)
        at io.realm.internal.OsObject.createWithPrimaryKey(OsObject.java:208)
        at io.realm.Realm.createObjectInternal(Realm.java:996)
        at io.realm.com_deals_bakooli_model_RestaurantRealmProxy.copy(com_deals_bakooli_model_RestaurantRealmProxy.java:1072)
        at io.realm.com_deals_bakooli_model_RestaurantRealmProxy.copyOrUpdate(com_deals_bakooli_model_RestaurantRealmProxy.java:1062)
        at io.realm.com_deals_bakooli_model_DealRealmProxy.copy(com_deals_bakooli_model_DealRealmProxy.java:1250)
        at io.realm.com_deals_bakooli_model_DealRealmProxy.copyOrUpdate(com_deals_bakooli_model_DealRealmProxy.java:1181)
        at io.realm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:214)
        at io.realm.Realm.copyOrUpdate(Realm.java:1634)
        at io.realm.Realm.copyToRealm(Realm.java:1016)
        at io.realm.RealmModelListOperator.copyToRealmIfNeeded(RealmList.java:1530)
        at io.realm.RealmModelListOperator.appendValue(RealmList.java:1456)
        at io.realm.ManagedListOperator.append(RealmList.java:1337)
        at io.realm.RealmList.add(RealmList.java:210)
        at com.deals.bakooli.activity.SingleDealActivity$addItemToCart$$inlined$use$lambda$1.execute(SingleDealActivity.kt:102)
        at io.realm.Realm.executeTransaction(Realm.java:1431)
        at com.deals.bakooli.activity.SingleDealActivity.addItemToCart(SingleDealActivity.kt:91)
        at com.deals.bakooli.activity.SingleDealActivity.onClick(SingleDealActivity.kt:82)

我不明白为什么尽管使用了copyToRealmOrUpdate,但还是抛出了异常。我做错了什么?

【问题讨论】:

  • 不应该是 realm.where(Cart.class).findfirst() 吗?
  • 查询没问题。 RealmKotlin 允许 realm.where&lt;Cart&gt;().findFirst()realm.where(Cart::class.java).findFirst()

标签: android realm realm-mobile-platform


【解决方案1】:

您的查询看起来不正确。

试试

realm.where(Cart.class).findFirst()

【讨论】:

  • 问题不在于读取查询,而在于写入。只要Restaurant 对象包含唯一ID,我就可以将商品添加到购物车中,因为我正在做copyToRealmOrUpdate
  • 尝试在餐厅上调用 copyToRealmOrUpdate,然后再将其添加到交易中
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多