2012-01-04 2 views
2

У меня много проблем, когда я пытаюсь сохранить NSManageObject в делегате и худшие проблемы с попыткой прочитать объекты. Мой Делегат что-то вроде этого:Пытается сэкономить NSManagedObject в appDelegate

@class ViewController; 
@class RootViewController; 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 
NSManagedObjectModel *managedObjectModel; 
NSManagedObjectContext *managedObjectContext; 
NSPersistentStoreCoordinator *persistentStoreCoordinator; 
Trips *trip; 
Garage *car; 
} 

@property (strong, nonatomic) UIWindow *window; 

@property (strong, nonatomic) ViewController *viewController; 
@property (strong, nonatomic) RootViewController *rootviewcontroller; 

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; 
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; 
@property (nonatomic, retain) Trips *trip; 
@property (nonatomic, retain) Garage *car; 

- (NSString *)applicationDocumentsDirectory; 
- (void) setCar:(Garage *)Car; 
- (void) setTrip:(Trips *)Trip; 
- (Trips *) gettrip; 
- (Garage *) getcar; 

@end 

Полные методы, чтобы установить и получить, как это:

- (void) setCar:(Garage *)Car 
{ 
    car = Car; 
} 
- (void) setTrip:(Trips *)Trip 
{ 
    trip = Trip; 
} 
- (Trips *) gettrip 
{ 
    return trip; 
} 
- (Garage *) getcar 
{ 
    return car; 
} 

В первый взгляд, когда я делаю:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
trip = (Trips *)[NSEntityDescription insertNewObjectForEntityForName:@"Trips" inManagedObjectContext:context]; 
[appDelegate setTrip:trip]; 

Кажется работа хорошо, даже если я делаю NSLog (@ "% @", [appDelegate gettrip]); , он показывает мне объект без проблем. Но когда я пытаюсь прочитать ту же поездку с [appDelegate gettrip] в другом представлении, вообще не работает, на самом деле с NSLog говорится, что объектом является тип Garage вместо Trips.

Я не знаю, что я делаю неправильно. Помогите.

+0

В стороне, '- [NSEntityDescription insetNewObjectForEntityForName: inManagedObjectContext:]' возвращает 'id', и поэтому вам не нужно отображать возвращаемый объект. –

+0

Зачем проходить через все эти методы реализации rigmarole и объявлять переменные-члены для свойств поездки и автомобиля? Это сбивает с толку и может быть источником вашей проблемы. Просто установите объект в свойство и вуаля, для вас все будет обработано: 'appDelegate.trip = trip' и' appDelegate.car = car'. – Jeremy

+0

Спасибо, Джереми. Я сделал то, что вы сказали, и это лучше, но мне кажется, что моя проблема связана с NSManagedObjectContext, потому что у меня возникли проблемы с сохранением данных, добавив [контекстный сброс], который можно сохранить, но я потерял данные, сохраненные в делегат. Я также пытаюсь использовать [context redo], но он не работает. Или сохраните мои изменения или сохраните поездку в делегате. Я не могу сделать то и другое. –

ответ

3

Вы не забудете сохранить контекст после создания элемента? Если вы не сохраните его, я не думаю, что ваш новый объект будет правильно сохранен. В коде вы просто создать объект в контексте, но вы должны сохранить контекст для его постоянства:

NSError *error = nil; 
if(![self.managedObjectContext save:&error]){ 
    //Handle error 
} 

Я надеюсь, что это помогает!

+0

Сохранение важно, это не похоже на проблему с сохранением, так как он хранит объект в собственности. В этом коде это * просто * другой объект. Нет никакой выборки или чего-либо еще, что бы требовало сохранения. –

+0

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

+0

Возможно, вы могли бы включить Зомби, чтобы посмотреть, не пропадет ли поездка где-то. – tams

0

Пока вы создаете объект для сохранения, он не похож на то, что вы фактически сохраняете объект в постоянном хранилище.

попробовать это:

if (![managedObjectContext save:&error]) { 
    NSLog(@"ERROR: %@", [error userInfo]); 
} else { 
    NSLog(@"EVERYTHING SHOULD HAVE SAVED PROPERLY"); 
} 

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

+0

Сохранение важно, это не похоже на проблему сохранения, поскольку он хранит объект в свойстве. В этом коде это * просто * другой объект. Нет никакой выборки или чего-либо еще, что бы требовало сохранения. –

+0

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

1

Если NSLog сообщает о другом объекте, вам необходимо посмотреть, где вы создаете объект Garage.

Возможно, у вас есть простая копия и вставка ошибки?

0

Это проблема управления памятью с вашими настройщиками? в противном случае я не думаю, что он сохранит свой объект поездки и он получит autoreleased -

они должны быть

- (void)setTrip:(Trip *)Trip { 
    self.trip = Trip; 
} 

т.е. self.trip = вместо того, чтобы просто trip = использовать свойство делать. Затем, когда вы приступите к использованию позже, в этом месте памяти появится что-то еще.

Отказ от ответственности - Я все еще не на 100% с ARC, но, возможно, я ошибаюсь. Однако стоит попробовать!

+0

Спасибо, я попробую, но он сработает: /. –

+0

«Сбой» не очень полезное сообщение - как он падает; где он падает; Какова трассировка стека, когда это происходит? – deanWombourne

+0

Извините за мой ответ, это не проблема. Похоже, что моя проблема связана с NSManagedObjectContext, потому что у меня проблемы с сохранением данных, добавление [контекстного сброса] y может сохранить, но я потерял данные, сохраненные в делегате. Я также пытаюсь использовать [context redo], но он не работает. Или сохраните мои изменения или сохраните поездку в делегате. Я не могу сделать то и другое. –

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