2013-10-19 73 views
0

以下是實體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基本上是一個與NSMutableArrayNSNumber元件。在一個函數裏面,我正在更新這個數組:

- (void)itemWasDropped:(ItemIndex)item 
{ // _player has been correctly retrieved 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]]; 
} 

這個函數被調用得很完美。我將這個上下文保存在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) 
    { 
     ... 
    } 
} 

問題是隻要我不關閉任務欄中的應用程序,更新在其他視圖中可見。有什麼問題?任何人都可以幫忙

+0

是利用自身的管理對象上下文中的每個看法? –

+0

不,上下文是一樣的。每個視圖都會詢問AppDelegate的上下文。如果上下文尚未初始化,則會初始化並返回。如果有,AppDelegate會簡單地返回它。 – user2226125

+0

剛剛解決它。爲了更新Core Data實體中的數組屬性,必須將該數組分配給視圖控制器類中的另一個「@ property」數組或其他數據,並更新「@ property」數組。在更新數據庫之前,必須將@屬性數組分配回實體屬性。 – user2226125

回答

2

核心數據可以存儲數組,但是您將不得不使用「可轉換」屬性。一般來說這不是很好的設計。一個簡單的解決方案是將您的數字數組轉換爲可以存儲的數字。例如,在許多情況下,僅使用一個字符串就足夠了。

編碼:

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

解碼:

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

謝謝,但核心數據可以通過Transformable來完成。我試過這個,它的工作原理。 – user2226125

+0

剛剛解決它。爲了更新Core Data實體中的數組屬性,必須將該數組分配給視圖控制器類中的另一個「@ property」數組或其他數據,並更新「@ property」數組。在更新數據庫之前,必須將@屬性數組分配回實體屬性。 – user2226125

+1

如果你已經解決了問題,你應該詳細發佈你的答案,以便其他人可以閱讀和理解你的解決方案。 另外,爲什麼你不使用與一個不同的實體類型的一對多關係? – Holly

0

就解決了這個問題。爲了更新Core Data實體中的數組屬性,必須將該數組分配給視圖控制器類中的另一個@property數組,或者更新@property數組。在數據庫更新之前,必須將@property數組分配回實體屬性。

// 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) 
    { 
     ... 
    } 
}