Search code examples
iosswiftcore-datarelationships

Creating core data for chat app in swift


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?


Solution

  • 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):

    enter image description here

    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
    }