2017-08-14 90 views
2

我正在使用xcode来编写iOS应用程序。我想在应用中设置一个用户可以留言的部分。对于如何存储特定帖子的评论集,我有点困惑。我基本上只需要为每个评论保存三件事。用户的ID,评论本身和评论的数量(即发布该帖子的第一条评论,或第二,第三等...),但我不知道如何最好地将其实际保存到数据库。我使用parse-server作为主数据库,问题是虽然此数据库可以存储对象的多种质量,但不能保存字典。 (我本来想保存信息为):
期望中的战略(但不工作)如何构建数据以保存用户评论?

var commentCount = 5 //will hold value of number of comments for post 
var commentString = "hello" 
var commenterID = "e1das312" 


var commentSavingDict = [Int: [String]]() 
func addComment(){ 
    commentCount = commentCount + 1 
    commentSavingDict[commentCount] = [commenterID, commentString] 
} 

的问题是,在解析仪表盘只有阵列可以被保存,而不是词典作为commentSavingDict是。我认为只是节省了串大抵如此:

第二项策略

var commentCount = 5 //will hold value of number of comments for post 
var commentString = "hello" 
var commenterID = "e1das312" 


var commentSavingArray = [String]() 
func addComment(){ 
    commentCount = commentCount + 1 
    commentSavingArray.append("\(commentCount) :::: \(commentString) :::: \(commenterID)") 
} 

这种方法是有效的,但需要拉从阵列中的每个条目,然后在::::.split分隔字符串将每个部分倾倒成3个独立的阵列,然后以这种方式利用它们。这需要更长的时间,因为拆分需要客户端。

第三种策略
最后的办法,我设想也只是让每个评论是在数据库中它自己的对象,有四个不同的特质:评论的数量,评论,帖子的ID,和用户的ID。这也会起作用,但它现在使每个评论成为它自己的对象,而不是作为特定帖子的所有评论阵列(作为单个对象),我认为这样做效率低下并且很快就会占用空间。

由于我无法保存字典,有没有比我所建议的更好的方法来解决这个问题?还是我错误地分析了我提出的那些?

回答

1

你的第三个策略是要走的路。实际上,Parse iOS Developer's Guide有一个非常熟悉的例子。每条评论都通过指针链接到原始文章。当你来检索帖子的评论时,这确实涉及额外的提取,但它比试图将评论对象置于帖子本身的数组列中更具可扩展性。数组列对于更小,更简单的集合更有用。

这不是没有一些边缘情况的限制。例如,如果您想在时间轴上显示帖子的评论数量,则必须为每个帖子在屏幕上提取所有评论。通常的解决方案是在邮件本身存储计数器,并在添加/删除注释时更新它(理想情况下,通过Cloud代码中的afterSave触发器)。

一个额外的注意事项 - 你可以避免存储'评论号码',而是依赖评论日期createdAt。您可以通过过滤帖子并按创建日期排序来检索您的评论。

+0

感谢您的回复和指南的链接!但是,你能评论我对它的担忧吗?是否通过与其他方法相比增加对象的数量来为每个评论创建单独的对象而不会使数据库停滞不前? –

+1

想想这样 - 你不会创建任何更多或更少的对象,只是因为你每行存储一行而不是一行。它仍然是相同数量的信息。事实上,使用单独的对象可能在数据层面上更有效率,因为这是它期望的结构,并且已经进行了优化。 –