2012-12-17 76 views
0

我有一个核心数据对象的奇怪问题。使用核心数据返回空值

我有这样的对象:

2012-12-17 20:20:54.756 test[8581:c07] <NSManagedObject: 0xaa52ef0> (entity: Card; id: 0xaa4ec40 <x-coredata://CF3F8F22-FE94-452E-9BFB-D4216847C8D4/Card/p14> ; data: { 
    chlore = 0; 
    "continue_filtering" = 1; 
    "created_at" = "2012-12-01 09:55:05 +0000"; 
    customer = "0x7533700 <x-coredata://CF3F8F22-FE94-452E-9BFB-D4216847C8D4/Customer/p1>"; 
    "cyanuric_acid" = 9; 
    date = "2012-12-01 00:00:00 +0000"; 
    "electricity_day_used" = 67; 
    "electricity_night_used" = 67; 
    "end_time" = "2012-12-01 10:54:00 +0000"; 
    "filtering_end" = "2000-01-01 09:54:00 +0000"; 
    "filtering_start" = "2000-01-01 09:54:00 +0000"; 
    furniture = 1; 
    "furniture_to_get" = ""; 
    heater = 0; 
    id = 39; 
    miscellaneous = Zer; 
    ph = "7,2"; 
    "regulation_temperature" = 56; 
    "start_time" = "2012-12-01 10:54:00 +0000"; 
    "treatment_anti_algae" = 5; 
    "treatment_auto_stop_filling" = 0; 
    "treatment_chlore" = 5; 
    "treatment_filling_start" = 0; 
    "treatment_floculant" = 0; 
    "treatment_hypo_stick" = nil; 
    "treatment_hypochlorite" = 5; 
    "treatment_pebble" = 5; 
    "treatment_ph_less" = 5; 
    "treatment_ph_plus" = 5; 
    "updated_at" = "2012-12-01 09:55:05 +0000"; 
    "water_quality" = "Eau bleue limpide"; 
    "water_used" = 56; 
    works =  (
    ); 
}) 

但是当我做card.treatment_ph_less返回null。你有什么想法,为什么?这个问题的根源是什么?

我的字段被定义为double。

回答

0

您是否有机会尝试将您在一个线程或队列中创建的托管对象用于另一个线程或队列?

由于管理的对象不是线程安全的 - 事实上他们比在平常更不安全他们从来没有使用安全,从他们在创建线程离开

在实践中,如果对象是一个。当你尝试在一个线程/队列上访问它而不是它创建的线程/队列时出错,那么它可能无法加载它的数据。这不是你可以依赖的东西,它只是在经验上似乎是真的,至少在iOS的某些子集中。然而,这有可能是这里发生的事情吗?

解决方案是为每个线程/队列创建一个托管对象上下文,确保插入和删除在所有上下文之间传播,并通过对象ID将对象从一个上下文移植到另一个上下文 - 请参阅Apple的Concurrency with Core Data文档。

+0

我不明白的是:当我做卡片。调节温度,我得到了“56”。但是对于所有的“处理_ *”属性,我得到了空...如果我在坏的托管对象上下文中,一切都将为空,对吧? – Sebastien

+0

我不知道它是否可以帮助,但有唯一的字段声明为double ... – Sebastien

+0

如果您的托管对象在不同的​​线程/队列上,而不是它所属的上下文创建的,那么技术上的行为会未定义。我不得不承认Core Data如何将事物描述为文字(经典的他们都是对象)的经验有限,所以我不能凭经验确切地说出什么是未定义的行为。尽管如果你正在使用正确的队列/线程进行对象访问,那么我肯定可以说我的猜测是错误的。 – Tommy