2016-01-26 121 views
4

数据控制器核心数据:数据不存储到数据库(SWIFT)

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() 
     } 
    } 
} 
} 

我的实体 enter image description here

插入函数

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)") 


} 

我是试图插入数据uploadToCoreData()功能。它似乎没关系,因为它不打印“错误保存上下文”,当我使用,但是当我提取的数据打印“总照片:0”它应该是4.我错过了什么?

回答

3

你正在创建的DataController多个实例,不这样做,

我建议使用一个单独的类,以确保始终可以访问相同的核心数据堆栈组件。

一下添加到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)") 
}