在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false

Posted

技术标签:

【中文标题】在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false【英文标题】:RestKit managed object created on GET returns false for bool always 【发布时间】:2014-05-28 04:31:30 【问题描述】:

我正在使用带有布尔 isPrimary 的实体映射的 rest kit 进行 GET 调用。调用成功,并且映射数组在我 nslog 时也具有正确的 isPrimary 值。但是,当我使用没有任何谓词的简单获取请求检索实体表单核心数据时,该值始终为“false”。所有非布尔变量都是正确的。非常感谢任何帮助。干杯

标题:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "StringBase.h"

@class MaterialPlantRel, PriceList, SalesOrder;

@interface Currency : StringBase

@property (nonatomic, retain) NSNumber * baseCurrency;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) SalesOrder *billingCurrencyInv;
@property (nonatomic, retain) PriceList *currencyTOInv;
@property (nonatomic, retain) MaterialPlantRel *ledgerCostCurrencyInv;
@property (nonatomic, retain) SalesOrder *paymentCurrencyInv;
@property (nonatomic, retain) MaterialPlantRel *replacementCostCurrencyInv;

// Returns a dictionary representation of the
// object with var keys and values;
-(NSDictionary*) getDictionaryRepresentation;

/** Override to map the values to object **/
-(void) setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

@end

成功时输出 JSON:

        Sucess Currency (
        "<Currency: 0xda70f30> (entity: Currency; id: 0xb07e980 <x- coredata://C145A537-         5E8B-4E4E-95C1-BDFF10C84B05/Currency/p151> ; data: \n    active = 1;\n    baseCurrency =    1;\n    billingCurrencyInv = nil;\n    code = BRL;\n    createdBy = nil;\n    currencyTOInv = nil;\n    ledgerCostCurrencyInv = nil;\n    modifiedBy = nil;\n    name = \"Brazilian Riaz\";\n    paymentCurrencyInv = nil;\n    replacementCostCurrencyInv = nil;\n    version = 1;\n)",
       "<Currency: 0xda6c0b0> (entity: Currency; id: 0xb07d000 <x-coredata://C145A537-5E8B-4E4E-95C1-BDFF10C84B05/Currency/p152> ; data: \n    active = 1;\n    baseCurrency = 0;\n    billingCurrencyInv = nil;\n    code = USD;\n    createdBy = nil;\n    currencyTOInv = nil;\n    ledgerCostCurrencyInv = nil;\n    modifiedBy = nil;\n    name = \"US Dollars\";\n      paymentCurrencyInv = nil;\n    replacementCostCurrencyInv = nil;\n    version = 1;\n)"
        )

CoreData fetch : 

        NSFetchRequest* fetchRequest = [NSFetchRequest        fetchRequestWithEntityName:@"Currency"];
       // get the managed object context
       NSManagedObjectContext* l_MOC = [[[RestKitConfig ConfigManager] AppDelegateSales] managedObjectContext];
       // setup entity description
       NSEntityDescription* entityDescription = [NSEntityDescription
                                              entityForName:@"Currency"
                                              inManagedObjectContext:l_MOC];
       // fetch the request
      [fetchRequest setEntity:entityDescription];

    // Set example predicate and sort orderings...
    NSError* error;
    NSArray* array = [l_MOC executeFetchRequest:fetchRequest error:&error];

    if ([array count] > 0)
    
        // copy of the retrieved data
        self.data = [array copy];
#ifdef _DEBUG
        NSLog(@"Currency Data retrieved : %i Objects",[array count]);
        for (int i = 0; i < [array count]; i++)
        
            Currency* l_currency = [array objectAtIndex:i];
            NSLog(@"base currency -> %@",l_currency.baseCurrency);
        
#endif

Output : 
2014-05-28 13:07:03.187 Sales[2110:1003] base currency -> 0
2014-05-28 13:07:03.187 Sales[2110:1003] base currency -> 0

【问题讨论】:

是暂时的吗?显示您的测试代码。显示托管对象类头。 @wain 不确定您所说的瞬态是什么意思。我已经以两种方式发布了代码。 瞬态(相对于持久性)是您在数据模型中的属性上设置的标志。而且我在您添加的代码中的任何地方都没有看到isPrimary?!? 对不起,我忘了说我无法显示 isPrimary 代码。这只是一个有同样问题的假人。 @wain 我检查了瞬态标志,它设置为可选。使用索引选项进行了测试,但无济于事。 布尔值是 baseCurrency。抱歉,添麻烦了。非常感谢。 【参考方案1】:

在多线程环境中使用托管对象上下文时,您需要小心仅在预期线程上使用上下文。主线程有一个特定的上下文,每个后台线程都必须为其创建一个新的上下文。如果您对线程使用了错误的上下文(或在不使用私有队列的情况下访问私有队列上下文),那么您将看到奇怪的问题和/或异常。您将看到的问题类型取决于已保存到上下文中的内容以及您尝试执行的操作,但通常永远不会正确。

因此,请注意仅使用适当的上下文,并且上下文之间的关系可确保在您需要的地方通知和更新新保存的数据。

【讨论】:

以上是关于在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 映射问题 - 将新创建的托管对象发布到服务器

让 RestKit 离开特定的孤立 CoreData 托管对象

RestKit 托管对象上下文为零

如何在通过 Core Data 保存我的 RestKit 托管对象之前对其进行修改?

RestKit 将托管对象与非托管对象结合起来

如何在 RestKit 中请求托管对象而不将其写回托管对象上下文?