【问题标题】:How to implement Cora Data Persistent Management如何实现 Cora 数据持久化管理
【发布时间】:2015-03-20 19:56:32
【问题描述】:

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

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

这是我的课程:

NetworkingManager(API 调用)

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 类

//持久化管理器
- 全局 ObjectManagedContext
- 辛格尔顿
- 功能保存 (model1: Model1)
- 功能保存 (model2: Model2)
- ....

//网络管理器
- 辛格尔顿
- ...

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

【问题讨论】:

  • 你的代码中有太多非标准的东西,以至于无法判断你的问题可能出在哪里。 &lt;&lt;&lt; 是什么?还是&lt;&lt;&lt;&lt;*?这些不是标准的 Swift 运算符。那个GET(...) 电话是什么?你使用了太多自定义的东西,以至于很难判断到底发生了什么。
  • github.com/isair/JSONHelper GET 是一个 API 调用。我忘记发布函数标题了。我认为问题出在我的整个结构上。小代码问题以后很容易解决。
  • 联系人类(复数)有什么用?我假设这个类可能代表一个联系人(人),在这种情况下,宁可使用单数名称 Contact 作为类名。也不确定您是否要从对象 init() 方法内部创建对象并将其插入 MOC。
  • 是的,你是对的,我将其重命名为联系人。由于 Json 解析协议,我必须实现 init 方法。

标签: ios swift core-data persistentmanager


【解决方案1】:

通常,您的应用程序将有一个数据库(但它可能有多个,具体取决于您的要求)。如果我们假设您只需要一个,那么您需要创建一个 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;
}

保存 MOC 的 Swift 函数。每当您需要确保将内容写入磁盘时调用它。

// 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!
            }
        }
    }

【讨论】:

  • 您能否扩展您的示例代码以保存对象并将 Json 解析为 NsManagedObjects?
  • 我没有任何 Json 代码,但请记住,您不能直接将 Json 对象解析为 NSManagedObject 子类,最多只能将其解析为一些纯 Swift 或 Obj-C类,然后将属性复制到使用上述方法创建的 NSManagedObject 中。
  • 我真的需要两个对象来完成这么简单的任务吗?
猜你喜欢
  • 2023-03-19
  • 2013-02-09
  • 2015-11-15
  • 2014-05-13
  • 2011-05-10
  • 2010-12-31
  • 2022-01-27
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多