如何实现Cora Data Persistent Management

时间:2015-03-20 19:56:32

标签: ios swift core-data persistentmanager

到目前为止,我有以下结构:
- Singleton NetworkingManager(登录,注销API调用)
- 子类NSManagedObject(带子扩展)

我不知道如何构建应用程序的这一部分?
我需要PersistentManager / global ObjectManagedContext吗?

以下是我的课程:

NetworkingManager(API-call)

func getContacts() { 

        GET(APIURL.URL_CONTACTS ,parameters: nil,
        { (operation : NSURLSessionDataTask!, response : AnyObject!) -> Void in
            var contacts = [Contacts]()
            contacts <<<<* response
            //_sharedPersistentManager.save(contacts!)
        }, { (operation : NSURLSessionDataTask!, error : NSError!) -> Void in
           println("Error contacts")
    })
}

模型

import Foundation
import CoreData

class Contacts: NSManagedObject, Deserializable {

@NSManaged var firstname: String
@NSManaged var lastname: String
@NSManaged var id: String

required init(data: [String: AnyObject]) {
    let managedContext = (UIApplication.sharedApplication().delegate
        as AppDelegate).managedObjectContext!
    let entity = NSEntityDescription.entityForName("Contacts", inManagedObjectContext: managedContext)!
    super.init(entity: entity, insertIntoManagedObjectContext: managedContext)

    self.id <<< data["id"]
    self.firstname <<< data["1"]
    self.lastname <<< data["2"]
}
}

此代码失败...(Bad_ACCESS)

我在基本的课堂设计上挣扎。 你会发布一些伪代码,我可以理解基本的概念。

所有教程都解释了如何保存或获取某些数据,但不是整个应用程序的真实概念......

我正在寻找一个基本概念,如:
- 您应该实现一个Persistent Manager Singleton类

// PersistentManager
- 全局ObjectManagedContext
- 单身人士 - func save(model1:Model1)
- func save(model2:Model2)
- ....

// NetworkingManager
- 单身人士 - ......

编辑:
- 添加了一些代码
- 增加了进一步的解释

1 个答案:

答案 0 :(得分:0)

通常,您的应用程序将拥有一个数据库(但可能有多个数据库,具体取决于您的要求)。如果我们假设您只需要一个,那么您需要创建一个Core Data数据库(持久存储),并至少需要一个NSPersistentStoreCoordinator和一个ManagedObjectContext,以便通过ManagedObjects创建和更新数据库记录。只需使用模板应用程序即可获取示例代码。

我不会尝试使用ManagedObjects init()方法来创建对象,而是在另一个类中使用辅助函数来执行此操作。创建对象时将自动调用此init()方法,以便您可以使用它为属性设置一些默认值。

下面是一个示例ManagedObject(Swift类)和一个Objective-C辅助函数。提前道歉,您需要将其转换为等效的Swift代码。

//
//  DocumentCategory.swift
//  Sample
//

import Foundation
import CoreData

@objc(DocumentCategoryX)
class DocumentCategoryX: NSManagedObject {

    @NSManaged var image: NSData
    @NSManaged var name: String
    @NSManaged var sortIndex: NSNumber
    @NSManaged var viewName: String
    @NSManaged var documents: NSSet

}

用于创建托管对象的示例辅助函数(Core Data数据库记录)

- (NSManagedObject*)createNewCategory:(NSString*)entityName sortIndex:(int)sortIndex withName:(NSString *)name viewName:(NSString *)viewName icon:(UIImage*)icon;
{
    NSManagedObject *newCat = [NSEntityDescription
                               insertNewObjectForEntityForName:entityName
                               inManagedObjectContext:[self managedObjectContext]];
    [newCat setValue:[NSNumber numberWithInt:sortIndex] forKey:@"sortIndex"];
    [newCat setValue:name forKey:@"name"];
    [newCat setValue:viewName forKey:@"viewName"];

    [newCat setValue:UIImagePNGRepresentation(icon) forKey:@"image"];  // iOS
    return newCat;
}

Swift功能可以保存MOC。每当需要确保将内容写入磁盘时,请调用此方法。

// MARK: - Core Data Saving support

    func saveContext () {
        if let moc = self.managedObjectContext {
            var error: NSError? = nil
            if moc.hasChanges && !moc.save(&error) {

                //FLOG("Unresolved error \(error), \(error!.userInfo)")
                // Probably need a message to the user warning that a save failed!
            }
        }
    }