从核心数据中删除记录不起作用?

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 试图使用 intValueself.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 : 哥们有什么问题??

以上是关于从核心数据中删除记录不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

删除核心数据条目不起作用

从核心数据中检索 UUID 并设置 UUID 变量不起作用

通过 CKSubscription 观察 CKRecord 删除不起作用

从应用程序更改时,django 简单历史记录不起作用

sql级联更新和级联删除不起作用

删除一对零或一个子记录不起作用