Добавление уникальных объектов к Базовым Данным

Вы хотите модуль даты и времени.

>>> from datetime import datetime, timedelta 
>>> datetime(2008,08,18) - datetime(2008,09,26) 
datetime.timedelta(4) 

Или другой пример:

Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53) 
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import datetime 
>>> today = datetime.date.today() 
>>> print today 
2008-09-01 
>>> last_year = datetime.date(2007, 9, 1) 
>>> print today - last_year 
366 days, 0:00:00 

, Как указано здесь

10
задан Dimitri 5 August 2009 в 23:10
поделиться

2 ответа

Эта страница предоставляет некоторую помощь по оптимизации производительности: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW1

Хотя это не очень эффективно, почему бы просто не создать их в памяти с помощью NSDictionary? Прочтите все из Core Data в NSDictionary, затем объедините свои данные, заменив все в Core Data.

3
ответ дан 3 December 2019 в 23:50
поделиться

У меня все это работает очень хорошо благодаря Норману, который направил меня на правильный путь. Я отправлю здесь свой вспомогательный класс для других.

В основном, мой вспомогательный класс будет искать, существует ли NSManagedObject для некоторого идентификатора, и может создать его для некоторого идентификатора. Это выполняется для меня достаточно быстро: 1000 операций поиска / создания занимают около 2 секунд на моем iPhone (я также сделал несколько других вещей, чистый поиск / создание, вероятно, быстрее).

Он делает это путем кеширования словаря всех NSManagedObjects и проверки этого кеша, а не выполнения нового NSFetchRequest.

Пара модификаций, которые могут еще больше ускорить процесс: 1. Получить только выбранные свойства для NSManagedObjects 2. Получить в словарь только свойство идентификатора для NSManagedObject, а не весь объект. В моем тестировании производительности одиночный запрос не был медленной частью (но с 1000 элементами я ожидал, что он будет быстрым). Самой медленной частью было создание элементов.

  #import "CoreDataUniquer.h"


@implementation CoreDataUniquer

    //the identifying property is the field on the NSManagedObject that will be used to look up our custom identifier
-(id)initWithEntityName:(NSString*)newEntityName andIdentifyingProperty:(NSString*)newIdProp
{
    self = [super init];
    if (self != nil) {
        entityName = [newEntityName retain];
        identifyingProperty = [newIdProp retain];
    }
    return self;
}

-(NSManagedObject*)findObjectForID:(NSString*)identifier
{
    if(identifier == nil)
    {
        return nil;
    }
    if(!objectList)
    {   
        NSManagedObjectContext *moc = [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
        NSEntityDescription *entityDescription = [NSEntityDescription
                                                  entityForName:entityName inManagedObjectContext:moc];
        NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
        [request setEntity:entityDescription];

        NSError *error;
        NSArray *array = [moc executeFetchRequest:request error:&error];
        objectList = [[NSMutableDictionary dictionary] retain];
        for (NSManagedObject* p in array) {
            NSString* itemId = [p valueForKey:identifyingProperty];
            [objectList setObject:p forKey:itemId];
        }
    }
    NSManagedObject* returnedObject = [objectList objectForKey:identifier];
    return returnedObject;
}
-(NSManagedObject*)createObjectForID:(NSString*)identifier
{

    NSManagedObject* returnedObject = [NSEntityDescription
                                       insertNewObjectForEntityForName:entityName
                                       inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
    [returnedObject setValue:identifier forKey:identifyingProperty];
    [objectList setObject:returnedObject forKey:identifier];
    return returnedObject;
}


- (void) dealloc
{
    DESTROY(entityName);
    DESTROY(identifyingProperty);
    [super dealloc];
}

@end
4
ответ дан 3 December 2019 в 23:50
поделиться