【问题标题】:Not getting data from Core Data未从 Core Data 获取数据
【发布时间】:2012-08-28 18:50:00
【问题描述】:

我正在使用 Core Data 为我的应用程序存储一些信息。 我有一个包含 8 个实体的 .xcdatamodeld 文件,我将它们提取到不同的视图中。

在其中一个 viewController 中,我调用了其中的三个。像这样:

    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication]delegate];

managedObjectContext = appDelegate.managedObjectContext;

NSManagedObjectContext *moc = [self managedObjectContext];


NSEntityDescription *entiAll = [NSEntityDescription entityForName:@"AllWeapons" inManagedObjectContext:moc];
NSFetchRequest *frAll = [[NSFetchRequest alloc] init];
[frAll setEntity:entiAll];
NSError *error = nil;
arrAll = [moc executeFetchRequest:frAll error:&error];
displayArray = [[NSMutableArray alloc]initWithArray:arrAll];


NSEntityDescription *entiRange = [NSEntityDescription entityForName:@"WeaponsRanged" inManagedObjectContext:moc];
NSFetchRequest *frRanged = [[NSFetchRequest alloc] init];
[frRanged setEntity:entiRange];
NSError *errorRanged = nil;
arrRange = [moc executeFetchRequest:frRanged error:&errorRanged];
NSLog(@"%i, %i", [arrRange count], [[moc executeFetchRequest:frRanged error:&errorRanged] count]);


NSEntityDescription *entiMelee = [NSEntityDescription entityForName:@"WeaponsMelee" inManagedObjectContext:moc];
NSFetchRequest *frMelee = [[NSFetchRequest alloc] init];
[frMelee setEntity:entiMelee];
NSError *errorMelee = nil;
arrMelee = [moc executeFetchRequest:frMelee error:&errorMelee];
NSLog(@"%i, %i", [arrMelee count], [[moc executeFetchRequest:frMelee error:&errorMelee] count]);

问题是中间那个(填充 arrRange-array 的那个)不起作用..

arrAll 以所有正确数据注销,arrMelee 以所有正确数据注销(x4 出于某种原因,不知道这是否相关:S),但 arrRange 作为空数组注销。 [arrRange count]; 给了我 0,即使我知道那里有很多数据。 我在模拟器上运行了这段代码,找到了 .sqlite 文件,在 Firefox 的 SQLite Manager 中打开它,看到了正确的数据,40 行。

我进入 appDelegate,在必要时填写 CoreData,并看到以 JSON 格式下载数据的方法也成功将其发送到 sqlite。

这里我用来自 json 的数据填充 CoreData:

[self deleteAllObjects:@"WeaponsRanged"];
NSManagedObjectContext *context = [self managedObjectContext];

for(NSDictionary *item in jsonWeaponRanged)
{
    WeaponsRanged *wr = [NSEntityDescription insertNewObjectForEntityForName:@"WeaponsRanged" 
                    inManagedObjectContext:context];
    ///***///
    wr.recoil = [item objectForKey:@"Recoil"];
    ///***///

     NSError *error;
    if(![context save:&error])
        NSLog(@"%@", [error localizedDescription]);
}

如果我在这里做NSLog(@"%@ - %@", wr.recoil, [item objectForKey:@"Recoil"]);,我会得到正确的数据。 (两者数据相同)

所以。正确的数据显然在核心中。但是我的 NSFetchRequest 或其他东西失败了。我在 Objective-C 上很菜鸟,所以这可能是我糟糕的代码语法再次引人注目。我意识到我应该再次使用东西等,而不是一直创建新对象。但是 cmon,这是我的第一个应用程序。如果这确实是问题,我可能会学习。但我被困住了。

有时我会得到数据,有时我不会。有点奇怪。我重新启动了该应用程序,并从中获取了数据,但现在我没有..我还没有找到模式..

有人吗? 还是有其他方式向实体请求数据?

【问题讨论】:

  • 您是否从网络获取 JSON 数据?如果是这样,您能否显示加载例程的代码。
  • 嗯..我不认为这与它有任何关系..正如我所说,数据始终在 coredata 中,但不会在查询中返回。我在所有这些中都使用了相同的方法,并且通过在 FireFox 的 SQLite 管理器中打开它来证明 .sqlite 包含数据。
  • 你能遍历数组并打印WeaponsRanged 对象吗?例如for(NSManagedObject* obj in arrRange) { NSLog(@"--> %@", [obj valueForKey:@"aKey"]); }。让我知道你看到了什么。
  • @Flex_Addicted 嗯..当我现在在模拟器中启动应用程序时,我无法重现错误。我不知道它什么时候来袭。自从我写这篇文章以来,我什么也没做。所以注销了很多东西。但是,当我在 ios 设备上运行它时,它没有显示任何内容。数组不工作时为空。 [arrRange 计数] = 0。

标签: objective-c ios cocoa-touch core-data nsfetchrequest


【解决方案1】:

我有一些建议,太大了,无法评论。

1) 创建 WeaponsRanged 后,尝试回读它们:

for(NSDictionary *item in jsonWeaponRanged)
{
    WeaponsRanged *wr = [NSEntityDescription insertNewObjectForEntityForName:@"WeaponsRanged" 
                    inManagedObjectContext:context];
    NSLog(@"IS WR Realized? %@", wr ? @"YES" : @"NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO WR");
    ///***///
    wr.recoil = [item objectForKey:@"Recoil"];
    ///***///

     NSError *error;
    if(![context save:&error])
        NSLog(@"%@", [error localizedDescription]);
}

// Now lets see if we can retrieve them:
{
    NSEntityDescription *entiRange = [NSEntityDescription entityForName:@"WeaponsRanged" inManagedObjectContext:context];
    NSFetchRequest *frRanged = [[NSFetchRequest alloc] init];
    [frRanged setEntity:entiRange];
    NSError *errorRanged = nil;
    arrRange = [context executeFetchRequest:frRanged error:&errorRanged];
    NSLog(@"Wrote %i items, read back %i items", [jsonWeaponRanged count], [arrRange count] );
}

2) 在读取 WeaponsRanged 的​​ viewController 中,在 mod 上的 fetch 之前添加一个 assert:

    NSLog(@"IS moc set? %@", moc ? @"YES" : @"NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO MOC");

编辑:

3) 在您访问 MOC 的任何地方传播语句:

assert([NSThread isMainThread]); 

[如果您在 google 之前没有使用过断言并阅读该主题。这些是开发人员在潜在问题出现在 gui 或其他地方之前找出潜在问题的强大工具。它们通常被编译出来用于发布/分发构建。]

如果线程不是主线程,这将强制异常,然后让您通过跟踪堆栈跟踪来追踪原因。

【讨论】:

  • 我可以向您保证数据已正确保存,因为我可以预览 .sqlite 文件并查看数据。但是,现在我无法在模拟器上重现该问题。当我启动模拟器时,它会显示所有内容。当我在设备上启动它时,它和以前有同样的问题。它是完全随机的,早些时候它是相反的。我不知道是什么原因造成的.. 断言不起作用..(我真的不知道它做了什么,但它没有解决这个问题..)
  • 断言只是说 - 我“断言”里面的内容是真实的。所以它没有用 - 它崩溃了?这意味着 moc 为零。将断言更改为 NSLogs 并确保断言中的值不为零。另外,如果您不想尝试我给您的代码,因为您知道 sql 是正确的,那么,我想您可以自己修复它。它不仅仅是我 - 其他人正在阅读这个。您告诉我们 SQL 看起来很棒并不能解决基本问题 - Core Data 现在显然正在为您工作。记录在案,它现在为全世界数百万人服务。
  • 不,它没有崩溃。没有崩溃,我只是没有从请求中获得任何信息。 moc 已设置。如您所见,我总是对所有三个请求使用相同的 moc。也许这就是问题所在?但这并不能解释它有时是如何工作的。对我来说,获取似乎被窃听了。好像“SELECT * FROM Table”的返回是空的。它仍然作为一个数组返回,但是一个空数组。我不知道为什么它有时是空的..现在我无法重现这个问题..而且我没有做任何事情来解决它。似乎是随机的。我不希望它在发布后发生..
  • Core Data 正在被成千上万的开发人员和数百万用户使用。它已经过详尽的测试和审查。我在 Mac 和 iOS 上使用它已经很多年了,从来没有遇到过我无法追踪到我的编码问题的问题。显然,YMMV。如果您无意中从第二个线程访问它,那么肯定所有的赌注都关闭了。
  • 嗯,这是 ios6 测试版,所以我不太确定了.. 我不知道把我的 nslogs 放在哪里来检查发生了什么.. 一切正常,然后突然,有时不显示。 sqlite 包含数据,那么是什么导致 fetch 有时不返回任何内容..?
【解决方案2】:

没关系!这是我自己该死的错(又一次..)。

问题出现在我提供的代码之前,结果发现问题出现时数据从未在 .sqlite 文件中。

这就是我所拥有的:

我通过 json-request 从互联网收集数据。我已经告诉应用程序通过互联网检查数据的“版本”,如果数据已过时,则重新下载。

首先,我下载所有数据,然后将它们添加到 Core Data 中它们自己的实体中。下载后,我清除下载数据的当前Core Data实体。所以在每个添加方法的顶部它说,即[self deleteAllObjectsOfEntity:@"WeaponsRanged"];,我的整个问题是在addMelee-方法中,它还说[self deleteAllObjectsOfEntity:@"WeaponsRanged"];而不是@"WeaponsMelee",从而删除所有远程武器,然后添加近战实体。这也证明了我提到的另一个问题,即 arrMelee 注销了应有的四倍数据。

它有时起作用的原因是下载不是以任何有序模式进行的。所以addRanged 有时会在addMelee 之前被调用。如果远程先出现,它会清除 arrRanged,并用正确的数据填充它,然后混战出现,并将其清除。当首先调用 melee 时,它​​清除了 arrRanged 并为 arrMelee 填充了额外的数据,然后 ranged 来尝试清除一个空实体,然后用正确的数据填充它。

解决方案显然是在添加时更改删除的实体,因为它是错误的。

对不起.... :)

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多