I’m developing an application similar to an simple chat app and I need to use core data to save/fetch the chats based on specific user. I have now successfully created a model to save users, now I need to link them to their chats. For Saving user data I’ve created Entity UserData and below are my swift files
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)")
}
}
I was able to successfully save the user list using this class. Now I’ve created a ChatData Entity, below is its structure.
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?
}
Now for each specific user I should be able to create multiple ChatData objects corresponding to particular userId. I don’t have much experience with core data. I’ve looked at some samples on creating relationship, but I’m still not sure how it works. Do I need to create a relationship? If so how should I do it to make this work?
You can modify UserData
like this
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>?
}
and ChatData
like this
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?
}
The corresponding core data model has a one-to-many releationship from UserData to ChatData (some attributes are missing):
Some code that shows how you can create a user with two messages:
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()
with
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
}