快速为聊天应用创建核心数据

Posted

技术标签:

【中文标题】快速为聊天应用创建核心数据【英文标题】:Creating core data for chat app in swift 【发布时间】:2016-03-03 06:36:06 【问题描述】:

我正在开发一个类似于简单聊天应用程序的应用程序,我需要使用核心数据来保存/获取基于特定用户的聊天记录。我现在已经成功创建了一个模型来保存用户,现在我需要将他们链接到他们的聊天记录。 为了保存用户数据,我创建了实体 UserData,下面是我的 swift 文件

UserData+CoreDataProperties.swift

import Foundation
import CoreData

extension UserData 

    @NSManaged var firstName: String?
    @NSManaged var userStatus: String?
    @NSManaged var userId: String?
    @NSManaged var userStatus: String?
    @NSManaged var lastName: String?
    @NSManaged var profilePic: String?


UserData.swift

class UserData: NSManagedObject 


    convenience init(WithDictionary dict:NSDictionary)


        let appDelegate =  UIApplication.sharedApplication().delegate as! AppDelegate

        let managedContext = appDelegate.managedObjectContext

        let newEntity =  NSEntityDescription.entityForName("UserData", inManagedObjectContext:managedContext)

        // initializer on NSManagedObject class
        self.init(entity: newEntity!, insertIntoManagedObjectContext: managedContext)

        self.userId =  (dict.valueForKey(ID) != nil) && !(dict.valueForKey(ID) is NSNull)
            ? dict.valueForKey(ID) as! String
            : ""

       //similary initializing other variables

        //Saving to database

        do 
            try managedContext.save()

         catch let error as NSError  
            print("Could not save \(error), \(error.userInfo)")
        

    

我能够使用此类成功保存用户列表。现在我创建了一个 ChatData 实体,下面是它的结构。

ChatData+CoreDataProperties.swift

import Foundation
import CoreData

extension ChatData 

    @NSManaged var chatId: String?
    @NSManaged var chatOwnerName: String?
    @NSManaged var chatReadStatus: Boolean?
    @NSManaged var chatText: String?
    @NSManaged var chatTimestamp: String?
    @NSManaged var chatType: String?
    @NSManaged var imageData: String?
    @NSManaged var imageUrl: String?


现在,对于每个特定用户,我应该能够创建与特定 userId 对应的多个 ChatData 对象。我对核心数据没有太多经验。我看过一些关于创建关系的示例,但我仍然不确定它是如何工作的。我需要建立关系吗?如果是这样,我应该怎么做才能完成这项工作?

【问题讨论】:

试用过的领域数据库:realm.io ?比 Core Data 更容易使用,无需设置任何 Core Data 样板代码。 是的,使用关系。 @Zhang,您还应该提及您推荐它的领域限制,特别是在没有给出任何提示它如何帮助解决所提出的问题时... 我不知道领域限制,我不是这方面的专家,它为我完成了这项工作。我唯一知道的是它没有像 CoreData 那样的 iCloud 同步。我不想对我不是专家的事情给出误导性的限制:D 另外,这是评论和问题评论,而不是答案:D @Zhang 推荐不同的工具并不是一个有用的评论除非该工具专门解决了这个人遇到的问题。你还没有表明它确实如此。 @TomHarrington 当我看一个问题时,我也会想到用户想要达到的最终目标。这个问题可以解释为“我是应用程序开发的新手,我想用用户实体和消息实体构建聊天应用程序,但我只听说过 CoreData,我在这里,试图让它工作”或“我正在构建聊天应用程序,我绝对想使用 CoreData,我不想使用其他任何东西”。发帖者的最终目标可能是构建一个简单的聊天应用程序来学习应用程序开发,无论他使用 CoreData 还是 Realm 来实现这个目标对他来说可能并不重要。因此我的建议。 【参考方案1】:

你可以像这样修改UserData

extension UserData 
   @NSManaged var firstName: String?
   @NSManaged var userStatus: String?
   @NSManaged var userId: String?
   @NSManaged var userStatus: String?
   @NSManaged var lastName: String?
   @NSManaged var profilePic: String?
   @NSManaged var chats: Set<ChatData>?

ChatData 这样

extension ChatData 
   @NSManaged var chatId: String?
   @NSManaged var chatOwnerName: String?
   @NSManaged var chatReadStatus: Boolean?
   @NSManaged var chatText: String?
   @NSManaged var chatTimestamp: String?
   @NSManaged var chatType: String?
   @NSManaged var imageData: String?
   @NSManaged var imageUrl: String?
   @NSManaged var user: UserData?

对应的核心数据模型从UserData到ChatData是一对多的关系(部分属性缺失):

一些代码显示了如何使用两条消息创建用户:

let user=userWithName("MyName")
let chat01=chatWithText("How do you doing?")
let chat02=chatWithText("Fine.")
user?.chats=[chat01!,chat02!]
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.saveContext()

func userWithName(name:String) -> UserData? 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let userEntity =  NSEntityDescription.entityForName("UserData", inManagedObjectContext:managedContext)
    let user = NSManagedObject(entity: userEntity!, insertIntoManagedObjectContext: managedContext) as! UserData
    user.firstName=name
    return user


func chatWithText(text:String) -> ChatData? 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let chatEntity =  NSEntityDescription.entityForName("ChatData", inManagedObjectContext:managedContext)
    let chat = NSManagedObject(entity: chatEntity!, insertIntoManagedObjectContext: managedContext) as! ChatData
    chat.chatText=text
    return chat

【讨论】:

以上是关于快速为聊天应用创建核心数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 数据库和 Firebase 通知为聊天应用构建通知系统

iOS:使用 CoreData 的聊天应用程序

使用聊天消息

在基于 aws appsync 的聊天应用程序中显示在线用户

用于聊天应用程序的多个 websocket 实例

语音社交聊天app受欢迎的特点有哪些?