2016-08-05 62 views
0

我用下面的代码添加歌曲到一个列表,我的播放列表对象:iOS版 - 追加元素境界列表中不坚持元素

func addSongsForPlaylist(songs: [Song], list: Playlist) { 
    try! realm!.write { 
     for song in songs { 
      list.RLMsongs.append(song) 
     } 
    } 
} 

哪里songs只是歌曲的数组,我想要添加。 songs中的歌曲是非持久对象(现在还没有),但list已经在Realm中保留。

我在这里发现了很多关于stackoverflow的问题,它们似乎提出了同样的问题,但是他们的所有解决方案都是在将写入事务包装在一个写入事务中,我已经在做,正如你所看到的。

我也曾尝试以下操作:

try! realm!.write { 
    list.RLMsongs.appendContentsOf(songs) 
} 

正在发生的事情是,如果我在控制台输入po list.RLMsongs的新曲是存在的,它看起来很棒,但如果我进入po listRLMsongs属性缺失新歌。两者如何都是真实的?它似乎与自己相矛盾,似乎有一些基本的东西我缺少RealmSwift。

它看起来像是更新内存中的列表,但实际上并没有提交给Realm。因此,我想也许写块没有正确提交并将其包装在do catch中,但catch从未运行,因此写入事务应成功提交。

编辑:

另外,我注意到,我能够取消写交易,并没有给我一个错误。我认为这可能是这里发生的事情的线索。是否有可能列表被认为是非持续的,因此即使列表的内容(歌曲)是持久对象,它也不会在领域中正确更新?

回答

0

原来我的问题是,我不得不从领域重新获取播放列表......不知怎的,播放列表传递给函数并不被视为领域中有效的持久对象。 (即使我有其他更新功能,其工作方式与更新其他属性的方式相同,而不是将对象附加到歌曲列表中,并且这些更新功能工作正常)

我唯一的猜测就是与追加到列表中的内容有关的持久对象以某种方式工作不同,并且该列表必须在本地作用域中显式提取,而不仅仅作为函数参数传入。然而,我可能错了。我只是知道这就是我如何在我的最后工作。

0

这是因为po list显示了Realm对象的实例变量的内容,而不是Realm的内容。 Realm不会将数据库的所有内容复制到对象实例的实例变量中,因为这样做会很浪费。

Realm提供了一个LLDB插件(rlm_lldb.py),教导调试器显示Realm支持的实际内容而不是未使用的实例变量。但是,由于用于Swift语言支持的LLDB Python API的限制,它仅适用于Objective-C栈帧。

+0

真棒,这是有道理的。谢谢回答。现在为什么它实际上没有出现在领域?我使用Realm浏览器来查看领域中的内容,并且它不会将歌曲链接到播放列表,甚至不会将歌曲添加到播放列表中。 –

+0

如果您分享示范项目的示例项目,我很乐意为您提供更多帮助。 – jpsim

+0

我真的不能在另一个项目@jpsim中复制这个,但是我发现了一些关于写入事务的新信息(编辑后的最后一段)。这是否有助于为您解决这个问题? –