我使用以下代码将一首歌曲添加到我的Playlist对象的列表中:
func addSongsForPlaylist(songs: [Song], list: Playlist) {
try! realm!.write {
for song in songs {
list.RLMsongs.append(song)
}
}
}其中songs只是我想要添加的歌曲的数组。songs中的歌曲是非持久化对象(还不在Realm中),但list已经持久化在realm中。
我在stackoverflow上发现了相当多的问题,它们似乎都提出了相同的问题,但他们的所有解决方案都必须将append包装在一个写事务中,正如您所看到的,我已经在这样做了。
我还尝试了以下几种方法:
try! realm!.write {
list.RLMsongs.appendContentsOf(songs)
}发生的情况是,如果我在控制台中输入po list.RLMsongs,新歌曲就在那里,它看起来很棒,但是如果我输入po list,它的RLMsongs属性将丢失新歌曲。怎么可能两者都是真的呢?它似乎自相矛盾,似乎有一些基本的东西,我错过了关于RealmSwift。
它看起来像是在更新内存中的列表,但实际上并没有提交给Realm。因此,我认为可能是写块没有正确提交,并将其包装在do catch中,但catch从未运行过,因此写事务应该成功提交。
编辑:
此外,我注意到我能够删除写事务,并且它不会给我一个错误。我认为这可能是关于这里正在发生的事情的线索。有没有可能列表被认为是非持久化的,因此即使列表(歌曲)的内容是持久化对象,也不能在realm中正确地更新?
发布于 2016-08-10 13:41:51
事实证明,我的问题是我必须从realm...somehow重新获取播放列表,当播放列表传递到函数中时,它在realm中不被视为有效的持久化对象。(即使我有其他更新函数,它们的工作方式与更新其他属性相同,而不是将对象附加到歌曲列表中,这些更新函数工作得很好)
我唯一的猜测是,与追加到持久化对象内部的列表有关的事情以某种方式不同地工作,并且列表必须在本地范围内显式获取,而不只是作为函数参数传递。然而,在这一点上我可能是错的。我只知道我就是这么做的。
发布于 2016-08-06 03:00:44
这是因为po list显示的是领域对象的实例变量的内容,而不是领域的内容。Realm不会将数据库的所有内容复制到对象实例的实例变量中,因为这将非常浪费。
Realm提供了一个LLDB插件(rlm_lldb.py),它教导调试器显示实际的Realm支持的内容,而不是未使用的实例变量。但是,由于用于Swift语言支持的LLDB Python API中的限制,它仅适用于Objective-C堆栈框架。
https://stackoverflow.com/questions/38793128
复制相似问题