2014-12-23 7 views
0

Я использую API, и их классы, похоже, не соответствуют Core Data.Хранение данных основного ядра iOS 8

Классы Я пытаюсь хранить AftershipCheckpoint и AftershipTracking

заголовочных файлов для AftershipTracking выглядит следующим образом

@interface AftershipTracking : NSObject 

@property (nonatomic, strong) NSString* createTime; 
@property (nonatomic, strong) NSString* updateTime; 
@property (nonatomic, strong) NSString* identifier; 
@property (nonatomic, strong) NSString* trackingNumber; 
@property (nonatomic, strong) NSString* trackingPostalCode; 
@property (nonatomic, strong) NSString* trackingShipDate; 
@property (nonatomic, strong) NSString* trackingAccountNumber; 
@property (nonatomic, strong) NSString* slug; 
@property (nonatomic) bool isActive; 
@property (nonatomic, strong) NSDictionary* customFields; 
@property (nonatomic, strong) NSString* customName; 
@property (nonatomic, strong) NSNumber* deliveryTime; 
@property (nonatomic, strong) NSString* destionationCountryCode; 
@property (nonatomic, strong) NSArray* emails; 
@property (nonatomic, strong) NSString* expectedDeliveryDate; 
@property (nonatomic, strong) NSString* orderId; 
@property (nonatomic, strong) NSString* orderIdPath; 
@property (nonatomic, strong) NSString* originCountryCode; 
@property (nonatomic, strong) NSString* uniqueToken; 
@property (nonatomic, strong) NSNumber* shipmentPackageCount; 
@property (nonatomic, strong) NSString* shipmentType; 
@property (nonatomic, strong) NSNumber* shipmentWeight; 
@property (nonatomic, strong) NSString* shipmentWeightUnit; 
@property (nonatomic, strong) NSString* signedBy; 
@property (nonatomic, strong) NSArray* smses; 
@property (nonatomic, strong) NSString* source; 
@property (nonatomic, strong) NSString* tag; 
@property (nonatomic, strong) NSString* title; 
@property (nonatomic, strong) NSNumber* trackedCount; 
@property (nonatomic, strong) NSArray* checkpoints; 


- (NSString *)description; 

Он содержит массив AftershipCheckpoint поэтому я полагаю, мне нужно будет настроить этот класс также.

@interface AftershipCheckpoint : NSObject 

@property (nonatomic, strong) NSDate* createTime; 
@property (nonatomic, strong) NSString* slug; 
@property (nonatomic, strong) NSString* checkpointTime; 
@property (nonatomic, strong) NSString* city; 
@property (nonatomic, strong) NSString* state; 
@property (nonatomic, strong) NSString* countryCode; 
@property (nonatomic, strong) NSString* countryName; 
@property (nonatomic, strong) NSString* message; 
@property (nonatomic, strong) NSString* tag; 
@property (nonatomic, strong) NSString* zip; 

- (NSString *)description; 

Мое приложение имеет массив AftershipTracking как бы я идти о хранении массива для постоянных данных с использованием основных данных или есть лучший вариант?

+1

Сколько объектов каждого класса, вы, вероятно, есть? – pbasdf

+0

@pbasdf Я бы сказал, что не более 10 контрольных точек для отслеживания и не более 100 объектов отслеживания. – Clip

+0

В этом случае я думаю, что CoreData - это действительно путь.Контрольные точки будут относительно легко смоделировать, так как CoreData без проблем поддерживает атрибуты NSDate и NSString. Отслеживание будет сложнее моделировать, поскольку CoreData не поддерживает атрибуты массива или словаря. Как правило, коллекции моделируются как отношения с другими объектами, и для правильной моделировки вам нужно знать, какие типы данных они содержат, которые могут быть скрыты API. – pbasdf

ответ

2

Для удаления одного из трекинга от вас модель будет выглядеть примерно так ..

- (void)remove:(AftershipTracking *)package 
{ 
    [_packages removeObject:package]; 
    [_delivered removeObject:package]; 
    [_inProgress removeObject:package]; 

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Tracking" inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDesc]; 
    NSPredicate *pred =[NSPredicate predicateWithFormat:@"(trackingNumber = %@)", package.trackingNumber]; 
    [request setPredicate:pred]; 

    NSManagedObject *match = nil; 

    NSError *error; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 
    match = objects.firstObject; 
    [context deleteObject:match]; 

    [self sort]; 
    [context save:&error]; 
} 
1

Все, что кажется, готово использовать NSCoding для настойчивости. Для начала, в зависимости от размера, вы можете сохранить эти массивы в NSUserDefaults, или вы можете запустить Core Data Store и попробовать продолжить с помощью plist с ним. В общем, прежде всего, чтобы убедиться, что ваша логика правильная, используя читаемый человеком formate (plist в случае iOS), тогда, как только вы приобретете это, переключите хранилище на использование SQLite, но вам действительно нужно это сделать, если у вас есть много тысяч объектов, которые нужно сохранить.

Используя NSUserDefaults, этот массив сохранит в списке AftershipTracking, пока AftershipCheckpoint соответствует NSCoding.

1

В AftershipTracking,

  • Изменение isActive к NSNumber. Как NSNumber, его можно сохранить в CoreData.
  • Я предполагаю, что checkpoints представляет собой массив объектов AftershipCheckpoint. Это может быть установлено как отношение ко многим отношениям в вашей модели, которое изменит тип на NSSet. Когда вы извлекаете NSSet из CoreData, вы можете преобразовать его в массив с [checkpoints allObjects].
  • Другие NSArray s и NSDictionary s должны быть объектами Transformable.

В AftershipCheckpoint,

  • Этот класс хорошо, так как это связка NSString с и NSDate.

Оба класса должны быть подклассом NSManagedObjectModel. Вероятно, это хорошая идея создать их с помощью стандартных параметров моделирования основных данных (обязательно импортируйте основную структуру данных). Проверьте this Ray Wenderlich tutorial на основные данные.

+0

«BOOL» может быть сохранен в Core Data без проблем. «Bool» немного отличается. Я предполагаю по заявлению плаката, что «bool» является ошибкой, а «BOOL» является правильным типом. – quellish

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