Sau khi lưu dữ liệu (10 hồ sơ) với một tổ chức nào, tôi đang xử lý một lấy yêu cầu để có được tất cả các dữ liệu một lần nữa:giá trị đối tượng quản lý là một cách ngẫu nhiên null (dự án mẫu kèm theo)
//Saving data
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//Save to coredata
song = [NSEntityDescription insertNewObjectForEntityForName:@"Song"
inManagedObjectContext:context];
[song setValue:title forKey:@"title"];
[song setValue:songLink forKey:@"songWebLink"];
NSLog(@"Song link : %@",songLink);//Never get NULL
[song setValue:albumLink forKey:@"albumImageLink"];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}else{
NSLog(@"Record saved correctly");
}
}
Tiết kiệm trên đang làm việc tốt và Tôi đã sửa lỗi rất cẩn thận tất cả dữ liệu trước khi được lưu vào ngữ cảnh để đảm bảo không có thuộc tính nào là NULL
.
Vấn đề luôn luôn là với các thuộc tính songWebLink
, đôi khi nó được null khi tôi cố gắng ot cho nó trở lại dưới đây:
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSEntityDescription *songEntity=[NSEntityDescription entityForName:@"Song" inManagedObjectContext:context];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:songEntity];
NSError *fetchError;
NSArray *fetchedSongs=[context executeFetchRequest:fetch error:&fetchError];
NSMutableArray *songs = [[NSMutableArray alloc] init];
for (NSManagedObject *songObject in fetchedSongs) {
//here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th.
NSLog(@"song web link: %@",[songObject valueForKey:@"songWebLink"]);//albumImageLink and title attributes are fine
}
}
Vấn đề là khi tôi NSLog
các songWebLink
, nó được NULL, một lần cho 4 lần lặp lại, sau đó cho thứ 6, sau đó thứ hai vv Nó ngẫu nhiên gán NULL cho một thuộc tính khi tìm nạp. Khi lưu dữ liệu, tôi đảm bảo không có giá trị NULL
cho songWebLink
. Vì vậy, tôi đặt cược vào một cái gì đó khác là nguyên nhân của vấn đề này.
Mọi suy nghĩ?
EDIT
Sau đây là cách MOC được khởi tạo:
AppDelegate.m:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];//I tried initWithConcurrencyType:NSMainQueueConcurrencyType
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
Bắt đối tượng MOC để sử dụng nó trong một lớp học khác nhau:
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
Dự án mẫu: Nếu bạn cho rằng mình cần xem qua dự án ứng dụng, tôi đã tạo một phiên bản đơn giản mà trên đó tôi sao chép lỗi, bạn có thể tải xuống here.
Bạn đang lưu ngữ cảnh quá nhiều. Có thể điều đó gây ra vấn đề. Tôi muốn tạo 'NSManagedObject' tại' parser: didEndElement: namespaceURI: qualifiedName: 'và lưu tất cả chúng một lần trong' parserDidEndDocument: '. – Desdenova
Xin chào, tôi đã nghĩ về nó và đã thử nghiệm nó, nhưng cũng không hoạt động. – Malloc
Thử đặt thuộc tính 'songWebLink' thành một chuỗi được mã hóa cứng. Nếu vấn đề này biến mất, hãy xem xét kỹ hơn các giá trị thực tế sắp tới. Điều duy nhất tôi có thể nghĩ là đảm bảo bạn đang sử dụng ngữ cảnh và các đối tượng của nó trên hàng đợi được liên kết với ngữ cảnh. Vấn đề luồng có thể xuất hiện ngẫu nhiên. –