0

私はウェブアプリで作業しています。私はNSFetchedResultsControllerを扱うUITableViewControllerを持っています。CoreData を介して tableView のオブジェクトを保存します。ユーザーが UI を更新すると、サーバー リクエストを実行し、新しいエンティティごとにバッチ更新を呼び出すと、CoreData クラスは次のようになります。

extension DBOrder {
    @NSManaged var comment: String
    @NSManaged var date: NSNumber
    @NSManaged var id: NSNumber
    @NSManaged var maturity_date: NSNumber
    @NSManaged var number_of_tasks: NSNumber
    @NSManaged var price: NSNumber
    @NSManaged var status: String
    @NSManaged var subject: String
    @NSManaged var taskImages: [String]
    @NSManaged var theme: String
}

「id」はオブジェクトごとに一意です。「propertiesToUpdate」は、「maturity_date」: 1470427641000、「status」: 「some status」などのいくつかのフィールドで構成されます。「entityName」は「DBOrder」です。また、privateContext はバックグラウンドでエンティティを更新するための NSManagedObjectContext タイプです。

func updateCoreData(id: NSNumber, entityName: String, propertiesToUpdate: [String: AnyObject], privateContext: NSManagedObjectContext) -> Bool {
    let batchRequest = NSBatchUpdateRequest(entityName: entityName)

    batchRequest.predicate = NSPredicate(format: "id == %@", id)

    if !doesOrderExists(entityName, id: id, context: privateContext) {
        return false
    }

    batchRequest.propertiesToUpdate = propertiesToUpdate
    batchRequest.resultType = .UpdatedObjectIDsResultType

    do {
        let res = try privateContext.executeRequest(batchRequest) as! NSBatchUpdateResult
        let orderIDs = res.result as! [NSManagedObjectID]
        return (orderIDs.count != 0) ? true : false
    } catch {
        print(error)
    }
    return false
}

この関数は、サーバーからロードされた各オブジェクトに対して呼び出されます。オブジェクトが既に存在する場合は更新し、そうでない場合は新しいオブジェクトを作成します。

最後に、問題: バッチ更新を使用すると、NSNumber で正しく動作しません。NSNumber フィールドは常に nil になり、String フィールドと同様に機能します。それで、私は何を間違っていますか?

4

0 に答える 0