Master data: data is not stored in the database (fast)

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 essence 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 am trying to insert data using a function uploadToCoreData(). Everything seems to be in order, because it does not print the โ€œerror-saving contextโ€ when I used it, but when I received the data, it prints the โ€œgeneral photo: 0โ€, which should be 4. what am I missing?

+4
source share
1 answer

You create multiple instances DataController, do not do this

I recommend using a singleton class to always get the same components of the Core Data stack.

Add this to the class. DataController

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

uploadToCoreData()

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)")
}
+3

Source: https://habr.com/ru/post/1625993/


All Articles