Données de base avec l'atsortingbut Array

Ce qui suit est le file d'en-tête de l'entité Player .

 @interface Player : NSManagedObject @property (nonatomic, retain) NSNumber * experience; @property (nonatomic, retain) id items; @property (nonatomic, retain) NSNumber * level; @end @interface items : NSValueTransformer @end 

items est essentiellement un NSMutableArray avec des éléments NSNumber . Et à l'intérieur d'une fonction, je suis en train de mettre à jour ce tableau:

 - (void)itemWasDropped:(ItemIndex)item { // _player has been correctly resortingeved from the database // the current number of this item int nNum = [[_player.items objectAtIndex:item] intValue]; // to increment the number [_player.items replaceObjectAtIndex:item withObject:[NSNumber numberWithInt:nNum + 1]]; } 

Cette fonction est appelée parfaitement. Je sauvegarde le context dans la fonction viewWillDisappear .

 - (void)viewWillDisappear:(BOOL)animated { // _moc is an NSManagedObjectContext instance that has been correctly initialised. // to update the database NSError* err = nil; BOOL bSucc = [_moc save:&err]; if (err || !bSucc) { ... } } 

Le problème est que les mises à jour sont visibles dans d'autres vues tant que je ne ferme pas l'application dans la barre des tâches. Quel est le problème? Quelqu'un peut-il aider?

Les données de base peuvent stocker des arrays, mais vous devrez utiliser un atsortingbut "transformable". En général, ce n'est pas un très bon design. Une solution facile consiste à transformer votre tableau de nombres en quelque chose qui peut être stocké. Par exemple, dans de nombreux cas, il suffit d'utiliser une string.

Encoder:

 player.items = [numbers componentsJoinedBySsortingng:@","]; // Swift player.items = numbers.joinWithSeparator(",") 

Décoder:

 NSMutableArray* numbers = [NSMutableArray array]; for (NSSsortingng *s in [player.items componentsSeparatedBySsortingng:@","]) { [numbers addObject:@([s integerValue])]; } // Swift let numbers = player.items.characters.split { $0 == "," } .map { Int($0!) } 

Je viens de le résoudre. Pour mettre à jour un atsortingbut de tableau dans une entité de database, ce tableau doit être assigné à un autre tableau @property dans la class de controller de vue ou et mettre à jour le tableau @property . Avant la mise à jour de la database, le tableau @property doit être atsortingbué à l'atsortingbut d'entité.

 // to hold the player items // _player.items cannot be directly updated @property (strong, nonatomic) NSMutableArray* items; - (void)viewDidLoad { [super viewDidLoad]; ... NSError* err = nil; NSMutableArray* results = [[_moc executeFetchRequest:fr error:&err] mutableCopy]; if (err || results.count == 0) { ... } else { _player = [results objectAtIndex:0]; _items = _player.items; } } // events - (void)itemWasDropped:(ItemIndex)item { // the current number of this item int nNum = [[_items objectAtIndex:item] intValue]; // to increment the number [_items replaceObjectAtIndex:item withObject:[NSNumber numberWithInt:nNum + 1]]; } - (void)viewWillDisappear:(BOOL)animated { // to update the database _player.items = _items; NSError* err = nil; BOOL bSucc = [_moc save:&err]; if (err || !bSucc) { ... } }