Aldo Lazuardi
Aldo Lazuardi

Reputation: 1948

Core Data: Data does not store to database (swift)

Data Controller

class DataController {
let model = "GoodiesCoreData"


private lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
    return urls[urls.count-1]
}()

// *****
// ***** DocumentDirectory is the recommended place to store users' data *****
// *****



private lazy var managedObjectModel: NSManagedObjectModel = {
    let modelURL = NSBundle.mainBundle().URLForResource(self.model, withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()


// Store coordinator mediates the object model and the persistent store

private lazy var persistenceStoreCoordinator: NSPersistentStoreCoordinator = {
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.model)

    do {
        let options = [NSMigratePersistentStoresAutomaticallyOption: true]

        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options)
    }
    catch {
        fatalError("Error adding persistence store")
    }

    return coordinator
}()


lazy var managedObjectContext: NSManagedObjectContext = {
    var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
    context.persistentStoreCoordinator = self.persistenceStoreCoordinator
    return context
}()


func saveContext() {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        }
        catch {
            print("Error saving context")
            abort()
        }
    }
}
}

My Entity enter image description here

Insert Function

func uploadToCoreData() {
    for goodies in datas{ //4 datas
        let moc = DataController().managedObjectContext
        let corePhoto = NSEntityDescription.insertNewObjectForEntityForName("Photo", inManagedObjectContext: moc) as! Photo

        let image = UIImageJPEGRepresentation(goodies.croppedPhoto!, 1)
        corePhoto.photo = image
        corePhoto.qty = goodies.value

        let coreUser = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: moc) as! User
        coreUser.userId = userId

        let coreCart = NSEntityDescription.insertNewObjectForEntityForName("Cart", inManagedObjectContext: moc) as! Cart
        coreCart.cartId = cartId
        coreCart.productName = productName
        coreCart.price = price
        coreCart.quantity = quantity
        coreCart.cartToUser = coreUser

        corePhoto.photoToCart = coreCart

        print(corePhoto.qty)

    }

    DataController().saveContext()

    let request = NSFetchRequest(entityName: "Photo")
    let photoCount = DataController().managedObjectContext.countForFetchRequest(request, error: NSErrorPointer.init())


    print("total photo: \(photoCount)")


}

i'm trying to insert data with uploadToCoreData() function. It seems okay because it doesn't print "error saving context" when i used that but when i fetched the data it prints "total photo: 0" its supposed to be 4. what am i missing?

Upvotes: 4

Views: 151

Answers (1)

vadian
vadian

Reputation: 285240

You're creating multiple instances of DataController, don't do that

I recommend to use a singleton class to make sure to access always the same Core Data stack components.

Add this to the DataController class

class var sharedController : DataController {
  struct Singleton {
    static let instance = DataController()
 }
    return Singleton.instance
 }

then change the uploadToCoreData() to

func uploadToCoreData() {
    let dataController = DataController.sharedController
    let moc = dataController.managedObjectContext
    for goodies in datas{ //4 datas

        let corePhoto = NSEntityDescription.insertNewObjectForEntityForName("Photo", inManagedObjectContext: moc) as! Photo

        let image = UIImageJPEGRepresentation(goodies.croppedPhoto!, 1)
        corePhoto.photo = image
        corePhoto.qty = goodies.value

        let coreUser = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: moc) as! User
        coreUser.userId = userId

        let coreCart = NSEntityDescription.insertNewObjectForEntityForName("Cart", inManagedObjectContext: moc) as! Cart
        coreCart.cartId = cartId
        coreCart.productName = productName
        coreCart.price = price
        coreCart.quantity = quantity
        coreCart.cartToUser = coreUser

        corePhoto.photoToCart = coreCart

        print(corePhoto.qty)

    }

    dataController.saveContext()

    let request = NSFetchRequest(entityName: "Photo")
    let photoCount = moc.countForFetchRequest(request, error: NSErrorPointer.init())

    print("total photo: \(photoCount)")
}

Upvotes: 3

Related Questions