2016-03-03 46 views
2

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

的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? 

} 

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

+0

尝试境界数据库:http://realm.io/?比核心数据更容易使用,无需设置任何核心数据样板代码。 – Zhang

+1

是的,使用一种关系。 @张你还应该提到你的领域局限性来推荐它,尤其是在没有给出任何提示的情况下它如何可能有助于提问... – Wain

+0

我不知道领域的限制,我不是专家,它为我做这份工作。我唯一知道的是它没有像CoreData那样的iCloud同步功能。我不想对我不擅长的事情给出误导性的限制:D另外,这是一个评论以及一个问题评论,而不是一个答案:D – Zhang

回答

2

您可以修改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的一个一对多releationship到ChatData(某些属性丢失):

enter image description here

一些代码,演示了如何创建一个用户有两个消息:

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 
}