从核心数据中删除记录不起作用?
Posted
技术标签:
【中文标题】从核心数据中删除记录不起作用?【英文标题】:Delete record from core data not working? 【发布时间】:2017-10-04 06:22:33 【问题描述】:我正在处理核心数据,当我从数据库中删除记录时它不起作用。 实体名称:实体 属性:id、日期、标题
- (void) getData
NSFetchRequest * fetReq = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
NSError * fetchErrorObj;
NSArray *result = [self.ad.managedObjectContext executeFetchRequest:fetReq error:&fetchErrorObj];
NSLog(@"array count is %lu", result.count);
NSMutableArray *idArr = [[NSMutableArray alloc]init];
NSMutableArray *titleArr = [[NSMutableArray alloc]init];
NSMutableArray *dateArr = [[NSMutableArray alloc]init];
for (int i=0; i<result.count; i++)
self.storedManagedObj = [result objectAtIndex:i];
[idArr addObject:[self.storedManagedObj valueForKey:@"id"]];
[titleArr addObject:[self.storedManagedObj valueForKey:@"title"]];
[dateArr addObject:[self.storedManagedObj valueForKey:@"date"]];
self.idArray = sidArr;
要删除记录...
- (IBAction)deleteRecord:(UIButton *)sender
NSNumber *value=[NSNumber numberWithInt:[[self.idArray objectAtIndex:0] intValue]];
NSLog(@"%@", [self.idArray objectAtIndex:0]);
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Entity"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", value];
NSLog(@"predicate :%@", predicate);
[request setPredicate:predicate];
NSLog(@"request :%@", request);
NSError *error = nil;
NSArray *result = [self.ad.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"result: %@", result);
if (!error && result.count > 0)
for(NSManagedObject *managedObject in result)
NSLog(@"managedObject :%@", managedObject);
[self.ad.managedObjectContext deleteObject:managedObject];
//Save context to write to store
[self.ad.managedObjectContext save:nil];
我得到这样的结果 谓词:id == 38 请求:(实体:实体;谓词:(id == 38);sortDescriptors:((null));类型:NSManagedObjectResultType;) 结果 :( )
【问题讨论】:
【参考方案1】:错误很明显。它指出您需要为您的 FetchRequest 指定 SortDescriptor
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Entity"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
ascending:YES];
request.sortDescriptors = @[sortDescriptor];
或
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
阅读:NSFetchRequest without sort descriptors
编辑:
由于 OP 不关心以任何特定顺序对结果进行排序,并且问题缺少实体的描述,我可以看到的唯一字段是 id 更新我的答案以在排序描述符字段中使用 id
[[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
编辑 2:
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Entity"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", [self.idArray objectAtIndex:0]];
代码中的问题是:
NSNumber *value=[NSNumber numberWithInt:[[self.idArray objectAtIndex:0] intValue]];
OP 试图使用 intValue
从 self.idArray
中的对象创建 NSNumber
,这意味着 idArray 是 String
的数组,而不是 NSNumber
。这意味着id
在核心数据中被保存为字符串,而不是 NSNumber。
在谓词中,但是 OP 试图通过 NSNumber
与 id 进行比较。由于 id 是 String
并且传递的参数是 NSNumber
比较失败,因此没有返回任何对象。
【讨论】:
兄弟什么是排序键 @ios-developer : Entity 中的字段名称,需要对结果进行排序。因为在您的情况下,排序并不重要,请在实体中指定任何字段,例如名称 你可以指定key为“id” NSNumber *value=[NSNumber numberWithInt:[[self.idArray objectAtIndex:0] intValue]]; NSLog(@"%@", [self.idArray objectAtIndex:0]); NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Entity"]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" 升序:YES]; request.sortDescriptors = @[sortDescriptor]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", value]; NSLog(@"谓词:%@", 谓词); [请求集合谓词:谓词]; NSLog(@"请求 :%@", 请求);但结果为空 @ios-developer : 哥们有什么问题??以上是关于从核心数据中删除记录不起作用?的主要内容,如果未能解决你的问题,请参考以下文章