2015-01-05 3 views
0

Сценарий следующий:основных данных с отношением один ко многим - Сохранение/загрузка

Каждый раз, когда приложение запускается он загружает список Beacon с (объект) и список Action с (объект). Каждый Beacon имеет ноль или более назначенных действий. На данный момент (и простота) каждый маяк назначил одно действие.

Так что я загружаю данные и разбираю JSON на 2 NSMutableArray. Объект Beacon имеет некоторые переменные и идентификатор переменной. Объект Action имеет также некоторые строковые переменные и отношение beacon, которое является (внешним ключом) таким же, как переменная id в Beacon.

Я разработал синглтон для сохранения и загрузки данных. На данный момент мой код выглядит как эти:

+(void)saveBeacons:(NSMutableArray*)array andAction(NSMutableArray*)actionsArray andManagedObject:(NSManagedObjectContext*)managedObject{ 

NSDictionary *jsonDict3 = [[NSDictionary alloc] init]; 

NSManagedObjectContext *context = managedObject; 

for (int i=0; i<[array count]; i++) {   

    jsonDict3 = (NSDictionary*)[array objectAtIndex:i]; 
    NSManagedObject *newBeacon = [NSEntityDescription insertNewObjectForEntityForName:@"Beacon" inManagedObjectContext:context]; 

    [newBeacon setValue:[[jsonDict3 objectForKey:@"uuid"] uppercaseString] forKey:@"uuid"]; 
    [newBeacon setValue:[jsonDict3 objectForKey:@"minor"] forKey:@"minor"]; 
    [newBeacon setValue:[jsonDict3 objectForKey:@"major"] forKey:@"major"];   
}  

NSError *error = nil; 
// Save the object to persistent store 
if (![context save:&error]) { 
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
} 

Примечание: array содержит Beacon объект и actionArrayAction.

Я знаю, что мне нужно использовать вложенный цикл, но как я должен добавлять отношения для каждого действия с маяком? Также мне нужно переписывать данные каждый раз, когда пользователь загружает новые данные. Должен ли я прекратить использовать Core Data?

PS. Вот так выглядит мой основной дизайн данных: enter image description here

ответ

2

Прежде чем отвечать на ваши вопросы, несколько заметок.

Во-первых, для чего вам нужно создать пустой NSDictionary? И, что, если вы не используете ARC? Обращайте внимание на утечки памяти.

NSDictionary *jsonDict3 = [[NSDictionary alloc] init]; 

в вашей цикл вобще

NSDictionary *jsonDict3 = (NSDictionary*)[array objectAtIndex:i]; 

Во-вторых, я хотел бы переименовать id идентификатор в вашей Beacon модели, как beaconID или что-то еще. id - это ключевое слово, которое означает указатель на общий объект. Я бы также переименовал action в actions, чтобы выделить отношения «один ко многим» между Beacon и Action.

В-третьих, вместо простого управляемого объекта вы можете использовать NSManagedObject subclass.

Сказал это, о ваших вопросах.

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

Внутри второй for loop вам нужно создать объект действий и установить его beacon отношения к маяку (newBeacon) вы создали

[createdAction setValue:newBeacon forKey:@"beacon"]; 

Здесь вы могли бы иметь проблему, так как вы не знаете, если действие принадлежит маяку или другому.Вы должны найти способ фильтрации действий для определенного маяка. Таким образом, метод сохранения может стать:

+(BOOL)saveBeacon:(NSDictionary*)beaconRepresentation withActions:(NSArray*)actions { 

    // Create a Beacon 
    // For loop the array, create Actions and set the appropriate beacon relationships 
    // Return the save result 
} 

Также мне нужно перезаписывать данные каждый раз, когда пользователь загружает новые данные.

Это зависит от того, что вам нужно достичь. Каковы ваши требования?

Должен ли я прекратить использовать Core Data?

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

Смежные вопросы