CoreData: как получить конкретный объект с использованием предиката
Ситуация:
Получаю полную таблицу из моей базы данных данных sqllite и показываю ее в TableView следующим образом:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTable"
inManagedObjectContext:managedObjectContext];
Задача:
Как получить идентификатор EntryID и получить конкретную запись из базы данных (например, если я нажимаю на запись)? Я думаю, что это идет в правильном направлении?
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(id = %@)", myEntryID];
Ответы
Ответ 1
Если у вас есть объект записи с именем entry
, это будет предикат, подобный этому:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(SELF = %@)", entry];
Что примерно эквивалентно
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", entry.objectID];
При a NSManagedObjectID
вы получите что-то вроде:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", myEntryID];
Ответ 2
Это правильный предикат:
[NSPredicate predicateWithFormat:@"SELF = %@", objectID];
Где objectID
экземпляр NSManagedObjectID
.
Ответ 3
Вы можете посмотреть -[NSManagedObject objectID]
и -[NSManagedObjectContext objectWithID:]
.
Ответ 4
Когда вы создаете таблицу, вы делаете это либо с массивом, возвращаемым fetch, либо неявным массивом внутри NSFetchResultsController
. Поэтому объект, который вы хотите, имеет тот же индекс в массиве/контроллере, что и в таблице.
Итак, это просто вопрос вызова:
myObject=[fetchedArray objectAtIndex:tableRowIndex];
или
myObject=[myFetchedResultsController objectAtIndexPath:tableRowIndex];
Это настоящий гений UITable. Он всегда точно отражает модель данных. Вам никогда не нужно переводить между индексами таблиц и индексами вашей модели данных.