核心数据有时无法返回正确的数据

时间:2016-04-01 11:33:45

标签: objective-c core-data

我有一个继承自Data的自定义对象(NSObject),需要将其持久保存到核心数据中。因此,我创建了一个包含NSManagedObject的{​​{1}}(Transaction),如下所示:

Data

我创建了一个上下文,并在主线程上完成了与上下文相关的所有操作。

我让@interface Transaction (CoreDataProperties) @property (nonatomic) BOOL m_isUploaded; @property (nullable, nonatomic, retain) id m_transactionData; // this is the Data class, stored under Transformable @property (nonatomic) int64_t m_submitDateTimeEpochMilliseconds; @property (nullable, nonatomic, retain) NSString *m_uuid; @end 符合DataNSCoding协议。另外,NSCopying中使用的一些自定义类也符合Data

这是NSCoding的简短摘录:

Data.h

如果我纯粹只是插入,则没有问题(我通过查看@interface Data : NSObject <NSCoding, NSCopying> @property (strong, nonatomic, nullable) HeldItem *m_heldItem; @property (strong, nonatomic, nullable) NSDecimalNumber *m_discountAmount; @property (strong, nonatomic, nonnull) NSMutableArray<Record *> *m_records; @property (strong, nonatomic, nonnull) NSString *m_transactionId; @property (nonatomic) CLLocationCoordinate2D m_location; @property (strong, nonatomic, nullable) NSString *m_status; - (void)encodeWithCoder:(nonnull NSCoder *)aCoder; - (nonnull id)initWithCoder:(nonnull NSCoder *)aDecoder; ...lots of variables/methods here... @end 期间的变量来确认这一点)。或者如果我纯粹只是阅读,也不会有任何问题。

但是,如果我要插入新的encodeWithCoder:(和Transaction)记录,并搜索/读取现有记录并对其进行修改(Data),则现有记录不会t得到保存,新记录主要是空白(好像是新的)。此问题发生在随机。在遇到这种情况之前,我可以运行8次。

知道我哪里可能出错了吗?我已经被困了很长时间了。

这是它似乎给我带来问题的部分:

Data

-

    // Store the existing/new data into Core Data
    Transaction *t = [MANAGER createTransaction];
    Data *data = [Data new];
    t.m_kmsTransactionData = data;

    // ...some assigning stuffs to other variables...

    // ========== if this whole section is omitted the newly created record saves fine =========
    Transaction *old = [MANAGER getTransactionFromCoreDataWithId:someOldDataIdString];
    // oldData sometimes is returning a blank object (i.e. booleans are no, objects are nil etc)
    Data *oldData = [old.m_kmsTransactionData mutableCopy];

    oldData.m_status = @"old"; // testing to see if the old record gets updated

    old.m_isUploaded = NO;
    old.m_kmsTransactionData = [oldData copy];

    // This doesn't work because oldData.m_transactionId is nil
    data.m_transactionId = [MANAGER generateNewTransactionIDBasedOn:oldData.m_transactionId];
    //===============================================

    // ... more assigning code here ....

    // Save context
    [MANAGER saveDatabase];

1 个答案:

答案 0 :(得分:0)

我认为这是一个具有可转换属性的核心数据怪癖,但它不是。

我所在的部分

// ...some assigning stuffs to other variables...

我已将m_salesRecordId分配给已存在于数据库中的现有ID。因此,在搜索getTransactionFromCoreDataWithId:方法时,它会根据之前制作的m_salesRecordId返回新创建的对象。

至于为什么它有时工作而且它没有工作有时是因为获取的查询结果没有排序(我假设结果返回的顺序总是不按顺序),所以无论哪个记录被返回首先被返回作为搜索对象(可能是我刚创建的空对象或已经在里面的实际对象)。

我仍然无法理解为什么即使m_salesRecordId在搞砸之后为零,也无法保存对象中的其余变量。但由于一切都按预期工作,我现在就取胜。

TL; DR: 首先检查程序逻辑