在Realm中读取多对多关系中的对象?

时间:2018-02-11 15:49:00

标签: android realm

我在Realm中执行多对多关系,我正在尝试读取Realm中的对象,但我没有获得Realm Results。这就是我在Realm中存储对象的方式。

fun addMessage(message : Message?,ref_id : String?){
    Realm.getDefaultInstance().use {realm ->
        realm.executeTransaction {realm ->
            val num = realm.where<Messages>().max("auto_index")
            var nextVal : Int ?= null
            if (num == null){
                nextVal = 1
            }else{
                nextVal = num.toInt() + 1
            }
            val msg = Messages()
            msg.messageId = message?.message_uid
            msg.body = message?.body
            msg.isCheck = message?.isCheck
            msg.auto_index = nextVal

            val messa = realm.where<MessageRef>().equalTo("messageRefId",ref_id).findFirst()
            if (messa != null){
                messa.messages?.add(msg)
            }
            else {
                val messageRef = MessageRef()
                messageRef.messageRefId = ref_id
                messageRef.messages = RealmList<Messages>()
                messageRef.messages?.add(msg)
              realm.copyToRealmOrUpdate(messageRef)
            }
           realm.copyToRealmOrUpdate(msg)
        }
    }
}

这就是我从数据库中读取对象的方式。

   fun getAllMessages (realm : Realm?,messageRefId : String?)=
    realm?.where<MessageRef>()?.equalTo("messageRefId",messageRefId)?.findFirst()
            ?.messages?.sort("auto_index")

}

以下是我的MessageRef模型。

open class MessageRef : RealmObject() {
@Required
@PrimaryKey
var messageRefId : String ?= null

var messages : RealmList<Messages> ?= null
}

以下是我的消息模型。

open class Messages : RealmObject(){
@Required
@PrimaryKey
var messageId : String ?= null

@Required
var auto_index : Int ?= null

@Required
var body : String ?= null

@Required
var isCheck : String ?= null
}

但我没有得到任何结果。我调试代码,发现对象成功存储但无法读取.Below是我的活动代码。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_chat_page)
    initialize()
    message_ref_id = intent?.getStringExtra("conversation_id")
    toolbar_name?.text = name
    messageList = realmMessageController?.getAllMessages(realm,message_ref_id)
}

请告诉我任何人为什么我没有得到结果。

1 个答案:

答案 0 :(得分:1)

原始答案:您收到以下错误

IllegalArgumentException: 'value' is not a valid managed object

那是因为你试图将一个非托管对象添加到托管的RealmObject的RealmList

您可以使用copyToRealmOrUpdate()获取要保存的内容的托管代理:

messageRef.messages?.add(realm.copyToRealmOrUpdate(Messages().apply {
    messageId = message?.message_uid
    isCheck = message?.isCheck
    auto_index = nextValue
}))

编辑:要执行您想要的操作,只需检查托管的RealmObject(如果它已经在列表中)。

val managed = realm.copyToRealmOrUpdate(Messages().apply {
    messageId = message?.message_uid
    isCheck = message?.isCheck
    auto_index = nextValue
})
if(messageRef.messages?.contains(managed) == false) {
    messageRef.messages?.add(managed)
}

EDIT2:对于您的查询,您需要

open class Messages : RealmObject(){
    @Required
    @PrimaryKey
    var messageId : String ?= null

    @Required
    var auto_index : Int ?= null

    @Required
    var body : String ?= null

    @Required
    var isCheck : String ?= null
    }

    @field:LinkingObjects("messages")
    val messageRefs : RealmResults<MessageRef>? = null

然后

realm.where<Messages>()
     .equalTo("messageRefs.messageRefId", messageRefId)
     .sort("auto_index")
     .findAll()