Как искать в сущностях Core Data и удалять определенные объекты - PullRequest
1 голос
/ 15 ноября 2010

Мне неясно, как удалить определенные объекты из базы данных Core Data.Я думаю, у меня это работает, поэтому я могу найти объекты, но не знаю, как удалить их из Базовых данных.В этом примере я ищу в сущности News элементы, срок действия которых истек.Я использую свойство expires (int 32 unix time stamp) и проверяю, меньше ли число, чем текущая временная метка unix.Не уверен, что NSP-предикат прав в этом.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity]; 

// Set up predicate here?
NSPredicate *pred = [NSPredicate predicateWithFormat:@"expires < %i", dateInt]; // dateInt is a unix time stamp for the current time
[request setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"forename" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
[request release];

// delete the found objects here?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Вызовите -[NSManagedObjectContext deleteObject:] для каждого объекта, который вы хотите удалить, затем передайте изменения.

0 голосов
/ 13 апреля 2017

Вы можете использовать NSBatchDeleteRequest доступно для iOS 9.0+, macOS 10.11+, tvOS 9.0+, watchOS 2.0+

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"expires < %i", dateInt];
NSFetchRequest *fetchRequest = [News fetchRequest];
[fetchRequest setPredicate:predicate];
// Create batch delete request
NSBatchDeleteRequest *deleteReq = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
NSError *error = nil;
NSBatchDeleteResult *deletedResult = [appDelegate.persistentContainer.viewContext executeRequest:deleteReq error:&error];
if (error) {
  NSLog(@"Unable to delete the data");
}
else {
  NSLog(@"%@ deleted", deleteReq.result);
}

Код Swift (по ссылке выше)

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee")
fetch.predicate = NSPredicate(format: "terminationDate < %@", NSDate())
let request = NSBatchDeleteRequest(fetchRequest: fetch)

do {
    let result = try moc.execute(request)
} catch {
    fatalError("Failed to execute request: \(error)")
}

Примечание:

Я нашел ниже комментарий о execute из moc

Метод передачи запроса в хранилище без влияния на содержимое контекста управляемого объекта.

Это означает, что любые несохраненные данные в moc не будут затронуты. то есть, если вы создали / обновили объект, который соответствует критериям запроса на удаление и не вызывали save для moc, тогда этот объект не будет удален.

...