我在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)
}
请告诉我任何人为什么我没有得到结果。
答案 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()