Объект выборки свойством в Базовых Данных

Разработайте в технологии, которая собирается дать Вашему проекту лучшие шансы на успех - быстрый для разработки в, легкая отладка, простое развертывание, хорошие инструменты, Вы очень хорошо знаете его (если точка не должна учить новый язык), и т.д.

, Если Вы получаете десятки миллиона uniques месяц, можно всегда нанимать у нескольких человек и переписывать в другой технологии, если Вы должны как...

... Вы будете грабли - луг в кэш (извините - не мог сопротивляться!!)

10
задан winsmith 17 September 2009 в 12:33
поделиться

2 ответа

В следующем фрагменте кода показано, как получить объекты, соответствующие определенному предикату. Если таких объектов нет, фрагмент показывает, как создать новый объект, сохранить его и вернуть.

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourEntityName" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    // retrive the objects with a given value for a certain property
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"property == %@", value];
    [request setPredicate:predicate];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"yourSortKey" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];



    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    aFetchedResultsController.delegate = self;

    NSError *error = nil;
    NSArray *result = [managedObjectContext executeFetchRequest:request error:&error];

    [request release];
    [sortDescriptor release];
    [sortDescriptors release];


    if ((result != nil) && ([result count]) && (error == nil)){
         return [NSMutableArray arrayWithArray:result];
    }
    else{
        YourEntityName *object = (YourEntityName *) [NSEntityDescription insertNewObjectForEntityForName:@"YourEntityName" inManagedObjectContext:self.managedObjectContext];
            // setup your object attributes, for instance set its name
            object.name = @"name"

            // save object
            NSError *error;
            if (![[self managedObjectContext] save:&error]) {
             // Handle error
             NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

            }

            return object;

   }
19
ответ дан 3 December 2019 в 18:35
поделиться

Лучше не делать многократную выборку, если вы хотите проверить определенные свойства в локальных данных. Просто сделайте один запрос на выборку, используя предварительно заполненный массив, а затем выполните итерацию или отфильтруйте результаты.

Это фрагмент кода из Руководства по программированию ядра данных "Эффективная реализация поиска или создания":

// get the names to parse in sorted order
NSArray *employeeIDs = [[listOfIDsAsString componentsSeparatedByString:@"\n"]
        sortedArrayUsingSelector: @selector(compare:)];

// create the fetch request to get all Employees matching the IDs
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:
        [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:aMOC]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"(employeeID IN %@)", employeeIDs]];

// make sure the results are sorted as well
[fetchRequest setSortDescriptors: [NSArray arrayWithObject:
        [[[NSSortDescriptor alloc] initWithKey: @"employeeID"
                ascending:YES] autorelease]]];
// Execute the fetch
NSError *error;
NSArray *employeesMatchingNames = [aMOC
        executeFetchRequest:fetchRequest error:&error];
2
ответ дан 3 December 2019 в 18:35
поделиться