Предварительное заполнение базовых данных с помощью plist только при первом запуске приложений - PullRequest
5 голосов
/ 25 марта 2012

У меня есть файл plist, который представляет собой массив словарей.Где каждый словарь содержит набор строк.Каждый словарь представляет знаменитость.

Что я хотел бы сделать, так это заполнить Core Data содержимым этого списка при первом запуске приложений, после чего я хотел бы как-то проверить основные данные на наличие моих данных.и, если есть данные, загрузите их оттуда, иначе загрузите исходные данные из файла plist снова.

Я знаю, что возможно заполнить данные ядра из plist, но я предлагаю жизнеспособныйрешение?Или есть лучший подход?

Джек

Ответы [ 2 ]

8 голосов
/ 25 марта 2012

Мой пример кода

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if (![defaults objectForKey:@"dataImported"]) {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
    for (NSString *key in [dict allKeys]) {
        NSDictionary *node = [dict objectForKey:key];

        MyClass *newObj = .....
    }

   [defaults setObject:@"OK" forKey:@"dataImported"];
   [defaults synchronize];
}
0 голосов
/ 17 января 2013

Это делает то же самое, но с немного более сложным pList, который содержит массив словарей, представляющих данные по «теме», которые будут сохранены.В нем все еще есть некоторые отладочные журналы.Надеюсь, это кому-нибудь пригодится.

NSManagedObjectContext *context = self.managedObjectContext;
NSError *error;

NSFetchRequest *topicRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *topicEntityDescription = [NSEntityDescription entityForName:@"Topic" inManagedObjectContext:context];
[topicRequest setEntity:topicEntityDescription];
NSManagedObject *newTopic = nil;
NSArray *topics = [context executeFetchRequest:topicRequest error:&error];
if (error) NSLog(@"Error encountered in executing topic fetch request: %@", error);

if ([topics count] == 0)  // No topics in database so we proceed to populate the database
{
    NSString *topicsPath = [[NSBundle mainBundle] pathForResource:@"topicsData" ofType:@"plist"];
    NSArray *topicsDataArray = [[NSArray alloc] initWithContentsOfFile:topicsPath];
    int numberOfTopics = [topicsDataArray count];

    for (int i = 0; i<numberOfTopics; i++)
    {
        NSDictionary *topicDataDictionary = [topicsDataArray objectAtIndex:i];
        newTopic = [NSEntityDescription insertNewObjectForEntityForName:@"Topic" inManagedObjectContext:context];
        [newTopic setValuesForKeysWithDictionary:topicDataDictionary];
        [context save:&error];
        if (error) NSLog(@"Error encountered in saving topic entity, %d, %@, Hint: check that the structure of the pList matches Core Data: %@",i, newTopic, error);
    };
}
...