我正在使用 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 管理器中打开它,看到了正确的数据,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,这是我的第一个应用程序。如果这确实是问题,我可能会学习。但我被困住了。
有时我得到数据,有时我没有。有点奇怪。我重新启动了该应用程序,并从中获取了数据,但现在我没有……我还没有找到模式……
任何人?还是有另一种方式从实体请求数据?