2013-07-23 15 views
5

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.

+0

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

+0

Xin chào, tôi đã nghĩ về nó và đã thử nghiệm nó, nhưng cũng không hoạt động. – Malloc

+1

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. –

Trả lời

0

Sau nhiều ngày cố gắng tìm ra điều này, tôi đã chọn lựa để đi theo số MagicalRecord vì nó đơn giản hóa rất nhiều sự cố gắng tìm nạp. Nếu bất cứ ai có thể tìm ra vấn đề và giúp tôi, tôi sẽ xem xét câu trả lời của anh ấy như một câu trả lời.

0

này cung cấp cho một thử:

Bao gồm này trong thư mục lấy yêu cầu

[fetch setIncludesPropertyValues:YES]; 

Duyệt qua các đối tượng quay trở lại như thế này:

for (Song *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.songWebLink);//albumImageLink and title attributes are fine 
} 

Tôi không chắc chắn 100% điều này sẽ sửa chữa nó nhưng nó sẽ giúp đỡ trong việc tìm kiếm vấn đề nếu nó không.

0

Từ giao diện của nó, bạn luôn luôn chạy trên chính vì vậy tôi không nghĩ rằng có vấn đề về luồng/ngữ cảnh.

Có thể loại dữ liệu được trình phân tích cú pháp XML trả về không khớp với loại dữ liệu CoreData.

Thay vì đăng nhập như thế này:

NSLog(@"Song link : %@",songLink);//Never get NULL 

thử:

NSLog(@"Song link : %@",[song valueForKey:@"songWebLink"]); 
NSLog(@"Song link class : %@",[songLink class]); 

Tôi đặt cược bạn sẽ bắt đầu thấy các giá trị null của bạn trong nhật ký đầu tiên. Nhật ký thứ hai hy vọng sẽ cho bạn biết lớp nào thực sự được trả về bởi trình phân tích cú pháp XML.Bạn sẽ phải xử lý nó một cách thích hợp.