2011-07-06 5 views
5

Tôi gặp sự cố lạ trong ứng dụng Dữ liệu cốt lõi của mình.Vấn đề tiết kiệm dữ liệu cốt lõi: không thể cập nhật thuộc tính biến đổi (NSArray)

Tôi có ba thực thể trong ứng dụng của mình, nhưng hôm nay tôi đã tìm thấy sự cố với một trong số chúng. Thực thể có vấn đề của tôi được gọi là Invoice và có nhiều thuộc tính, bao gồm Products. Nó được mã hóa NSArray của NSDictionaries (thông qua NSValueTransformer mặc định).

Mọi thứ hoạt động tốt - tôi tạo hóa đơn, ứng dụng khách, hóa đơn, v.v. Mọi thứ đều hoạt động.

Nhưng, khi tôi chọn hóa đơn của mình từ danh sách rồi cố chỉnh sửa sản phẩm và nhấp vào nút 'Lưu', lưu của tôi chỉ hoạt động cho đến khi ứng dụng của tôi bị chấm dứt.

Sự cố chỉ xảy ra với mảng products của tôi - phần còn lại (ví dụ: ngày thanh toán, khách hàng, v.v.) tiết kiệm.


gì là tôi làm

tôi vượt qua đối tượng Invoice tôi qua

NSManagedObject *inv = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
invoiceEditor.invoice = inv; 

Và lưu dữ liệu của tôi (trong InvoiceEditor VC của tôi):

[self.invoice setValue:client forKey:@"Client"] // NSDictionary; 
[self.invoice setValue:products forKey:@"Products"] // NSArray of NSDictionaries; 
[self.invoice setValue:pmDate forKey:@"PaymentDate"] // NSDate; 
// other attributes 
NSManagedObjectContext *context = self.invoice.managedObjectContext; 
NSError *error = nil; 
if (![context save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

Everythings tiết kiệm cho đến khi bị chấm dứt: client, pr oducts, ngày tháng. Nhưng chỉ những sản phẩm được 'bán lại' sau khi chấm dứt.

Bất kỳ ai?

+0

Làm rõ: Ý của bạn là gì bởi "sản phẩm được 'bán lại"? Bạn có nghĩa là thuộc tính sản phẩm không được lưu? Bạn có nghĩa là nó hoàn nguyên về giá trị trước đó? Nói cách khác, điều gì sẽ xảy ra *** mong đợi để xem thuộc tính 'products' sau khi khởi động lại và những gì bạn thực sự *** thấy? – TechZen

+0

Bất kỳ lý do cụ thể nào mà bạn không sử dụng thực thể và mối quan hệ thay vì một loạt các đối tượng NSDictionary bên trong một NSArray? Đó là một thiết lập rất cồng kềnh và (rất có thể) chậm. – TechZen

+0

1. Tôi có nghĩa là thuộc tính sản phẩm được lưu nhưng sau khi ứng dụng của tôi bị chấm dứt, nó trở về giá trị trước đó. 2. Tôi không sử dụng mối quan hệ vì tôi cần các sản phẩm mọi lúc, ngay cả khi người dùng đã xóa chúng.Tôi có một thực thể được gọi là 'Sản phẩm' nhưng trong 'Hóa đơn' của tôi, tôi đang lưu trữ bản sao của nó. – akashivskyy

Trả lời

4

Chỉ tìm thấy sự cố. Từ Model Object Implementation Guide:

Nếu có phiên bản có thể thay đổi và bất biến của một lớp học mà bạn sử dụng để đại diện cho một tài sản như NSArray và NSMutableArray-bạn nên thường tuyên bố giá trị trả về của có được accessor như một đối tượng bất biến ngay cả khi nội bộ mô hình sử dụng một đối tượng có thể thay đổi.

products mảng của tôi thực sự là một trường hợp NSMutableArray. Tôi đã giải quyết nó bằng cách sao chép products (vì vậy tôi đã chuyển đổi mảng có thể biến đổi thành mảng bất biến). Bây giờ nó hoạt động. :) Và tôi không cần phải bắt đầu tiền thưởng ...

+0

Tôi đang xóa bộ não của mình như những gì loại chi tiết thực hiện điên rồ sẽ dẫn đến hiệu ứng bạn đang thấy. Tại sao hành vi nên khác biệt đối với một mảng có thể thay đổi được, là đa hình cho một mảng bất biến, và do đó yêu cầu phải thực hiện hành động cụ thể để được phân biệt khi chạy? Và thậm chí còn hấp dẫn hơn - tại sao lại là thoáng qua? – hatfinch

+0

Tôi không biết tại sao lại như thế. Và tôi không quan tâm, ứng dụng của tôi chỉ hoạt động! : P – akashivskyy

+1

Tôi đoán có hai loại lập trình viên trong thế giới này: những người chỉ muốn mã của họ làm việc và những người muốn hiểu tại sao nó lại làm. – hatfinch

0

Thật vậy, bạn vừa tìm thấy vấn đề. Xin lỗi tôi chỉ đọc vấn đề của bạn, nhưng CoreData có một số vấn đề trong quá trình lưu.

Mỗi thuộc tính trong đối tượng CoreData phải là đối tượng không thay đổi.