2016-03-03 92 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 
}