2013-02-23 43 views
5

Sau khi thêm phiên bản mô hình Dữ liệu cốt lõi mới vào ứng dụng của tôi, tôi đã thực hiện di chuyển nhẹ, rõ ràng là thành công. Tệp đã di chuyển được tải tốt, nhưng khi lần đầu tiên truy cập thuộc tính qua một mối quan hệ cụ thể, ứng dụng sẽ gặp sự cố NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'. Mối quan hệ này hoạt động tốt trước khi di chuyển. Tôi biết từ các bài viết khác ở đây rằng 4294967295 thực sự là -1, nhưng điều duy nhất tôi có thể xác định với 36 mục trong ứng dụng/dữ liệu của tôi là có tổng số 36 thực thể trong mô hình dữ liệu (để tham khảo, mối quan hệ đang được tìm nạp có 58 mục trong bảng của nó).NSRangeException sau Di chuyển dữ liệu lõi

Câu hỏi:

Câu hỏi của tôi là: dựa trên lỗi tôi nhận được và xử lý sự cố tôi đã thực hiện dưới đây, là có một loại thay đổi schema mà có thể vượt qua sự di cư nhẹ, nhưng tham nhũng dữ liệu trên đường đi, dẫn đến ngoại lệ đã lưu ý? Tôi sẽ cố gắng chia nhỏ quá trình di chuyển thành các phần nhỏ hơn trong một số phiên bản để tách biệt hoặc tránh vấn đề, nhưng sẽ tốt hơn nếu có thể tập trung vào các thay đổi lược đồ cụ thể có thể có lỗi.

Sự thất bại:

Sự thất bại xảy ra với đoạn mã sau vào "myobject":

[[self object2] text]; 

Mối quan hệ object2 là to-one, không bắt buộc cả hai cách và không phải về phía trước cũng không mối quan hệ nghịch đảo đã được thay đổi giữa các mô hình dữ liệu. Thuộc tính text có thể không liên quan bởi vì khi lỗi xảy ra, awakeFromFetch không đạt được trong đối tượng2. Nếu tôi gán [self object2] cho một biến trước câu lệnh trên, nhiệm vụ sẽ thành công và báo cáo data: <fault>.

Cơ sở dữ liệu:

Nhìn vào cơ sở dữ liệu trong sqlite3, tôi nhận thấy như sau:

  1. giá trị Chỉ số cho các mối quan hệ về phía trước và ngược lại dường như đúng trong mỗi bảng.
  2. Bảng object2 có hai cột cho mối quan hệ nghịch đảo thay vì một cột trước khi di chuyển (ZMYOBJECT như trước và bổ sung Z2_MYOBJECT, trống cho tất cả các hàng). Không có mối quan hệ nào khác được thêm vào để giải thích cột này.
  3. Trong bảng Z_PRIMARYKEY, tất cả các mục nhập sau di chuyển hiển thị -1 cho Z_MAX, trong khi trước khi di chuyển, chúng cho thấy số không cho bảng trống và số hàng tối đa cho các bảng được điền. Cập nhật thủ công Z_MAX vào các giá trị thích hợp không giúp ngoại lệ. Tất cả các giá trị Z_SUPER đều chính xác.

Tôi thiết lập mô hình ánh xạ để xem có bất kỳ điều gì trông có vẻ bất bình với ánh xạ tự động hay không, nhưng mọi thứ đều ổn.

Nhìn chung schema thay đổi:

Trong phiên bản mã nguồn của mô hình dữ liệu, đã có mười bốn đơn vị, trong đó chỉ có bốn đã được dân cư với dữ liệu (các ứng dụng vẫn đang được phát triển). Bảy là các thực thể cấp cao nhất và bảy là các thực thể con của ba trong số các thực thể cấp cao nhất.

Trong phiên bản đích của mô hình dữ liệu, hai mươi hai thực thể đã được thêm vào, một số cấp cao nhất và một số thực thể con, với hàng tá mối quan hệ, bao gồm một số bổ sung cho các thực thể hiện có.

Một số thuộc tính và mối quan hệ đã bị xóa khỏi các thực thể hiện tại và các mối quan hệ khác đã được thêm vào. Không có kiểu dữ liệu hoặc cài đặt mối quan hệ nào được thay đổi, không có thuộc tính hoặc mối quan hệ nào được đổi tên và không yêu cầu ánh xạ đặc biệt.

Cập nhật (2/25/12): Khi tôi bắt đầu làm việc trên một mô hình trung gian mới, tôi nhớ rằng tôi đã thay đổi lớp (representClassName) cho một số thực thể từ NSManagedObject thành lớp con NSManagedObject, nhưng không đã tạo các tệp lớp. Tôi đã không nghi ngờ rằng sẽ gây ra một vấn đề và, thực sự, tạo ra tất cả các tập tin lớp học đã không giúp đỡ với ngoại lệ. Tôi chỉ muốn lưu ý rằng là một thay đổi khác giữa các mô hình.

Kết luận:

Đây là một đoán hoang dã, nhưng nếu số lượng 36 đơn vị không phải là một trùng hợp ngẫu nhiên, có vẻ như rằng khi "myobject" cố gắng lỗi trong "object2" nó không có một tham chiếu hợp lệ cho bảng và đang cố tải bảng số -1, gây ra ngoại lệ. Thực tế là một nhiệm vụ đơn giản của [self object2] là thành công, tuy nhiên, không phù hợp với kết luận đó.

Bất kỳ ý tưởng nào?

Trả lời

2

Bằng cách làm việc thông qua một số di chuyển gia tăng, tôi đã có thể xác định nguyên nhân gây ra sự cố và giải pháp.

Vấn đề:

Một trong những thực thể tồn tại với dữ liệu không có thực thể con trong mô hình hiện tại. Nếu tôi tạo một mô hình mới đơn giản thêm một thực thể con, không chứa các thuộc tính hoặc các mối quan hệ, và không có thay đổi nào khác, quan sát NSRangeException, Z_MAX và nhân đôi mối quan hệ nghịch đảo được ghi trong câu hỏi của tôi tất cả xảy ra.

Giải pháp:

Sau khi quan sát những thất bại sau một di chuyển nhẹ "thành công" đối với trường hợp trên, tôi đã tạo ra một mô hình lập bản đồ. Vì thay đổi duy nhất là một thực thể bổ sung, tất cả nhưng một trong các ánh xạ thực thể thì đơn giản. Câu hỏi đặt ra là phải làm gì với thực thể được thêm vào duy nhất.

Theo mặc định, thực thể được thêm vào không có thuộc tính hoặc mối quan hệ của riêng nó đã hiển thị ánh xạ thuộc tính và mối quan hệ cho tất cả thuộc tính của cha mẹ. Tất cả các ánh xạ có biểu thức giá trị rỗng theo mặc định, mà tôi cho rằng có nghĩa là nó sẽ bỏ qua chúng trong quá trình di chuyển. Không đúng, rõ ràng. Bằng cách xóa tất cả ánh xạ thuộc tính và mối quan hệ trong ánh xạ thực thể và sau đó tắt ánh xạ suy luận, quá trình di chuyển đã tiến hành thành công.

Tôi vẫn phải giải quyết tất cả các thực thể còn lại và sẽ thử phương pháp này để thực hiện phần còn lại hàng loạt, với tất cả các thuộc tính và mối quan hệ được lên kế hoạch còn nguyên vẹn.

+0

bạn đã làm cách nào để chọn mô hình ánh xạ của mình? sau khi tắt di chuyển tự động? –

+0

@ JoãoNunes Khi bạn vô hiệu hóa quá trình di chuyển tự động, nó sẽ tự động chọn mô hình ánh xạ của bạn miễn là mã băm nguồn và đích khớp với nhau. Chúng phải khớp nhau, miễn là bạn chưa sửa đổi mô hình dữ liệu kể từ khi tạo mô hình ánh xạ. Thật không may, đôi khi họ không, như đã nói ở đây: (http://stackoverflow.com/questions/10894383/core-data-mapping-model-version-hashes-not-matching-to-source-model-version-hash). Bật chế độ Gỡ lỗi di chuyển dữ liệu lõi có thể giúp giải quyết các vấn đề với các mô hình ánh xạ không được chọn. –

+0

Cảm ơn lời khuyên. Tôi đã thêm gỡ lỗi cho di chuyển nhưng vẫn gặp sự cố. Tôi đã tạo một câu hỏi ở đây: http://stackoverflow.com/questions/17464414/core-data-mapping-model-not-working-with-correct-hashes –

1

Bài đăng của bạn hữu ích khi tôi gặp sự cố này. Cảm ơn bạn. [Bạn đã báo cáo lỗi chưa?]

Dưới đây là một số kết quả thử nghiệm khác nhưng, than ôi, không phải là giải pháp tuyệt vời.

  • Thay đổi giản đồ của tôi tương tự đã thêm một loại phụ thực thể không có thuộc tính hoặc mối quan hệ bổ sung. Thông báo lỗi giống với thông báo lỗi của bạn ngoại trừ các giới hạn là [0 .. 19]. Điều đó tương ứng với 20 loại thực thể, xác thực giả thuyết của bạn. Giống như tình huống của bạn, lỗi xảy ra khi cố truy cập thuộc tính thực thể sau khi di chuyển hoàn tất.

  • Thêm thuộc tính giả và mối quan hệ tự giả với loại thực thể mới không tránh được sự cố sau khi di chuyển. (Tuy nhiên, tôi đã không thử nghiệm với kiểu thực thể mới là thay đổi duy nhất schema từ trước đây tôi đẩy sự thay đổi schema để thử nghiệm alpha.)

  • tôi quan sát các triệu chứng Z2_MYOBJECT cột và Z_PRIMARYKEY.Z_MAX = -1 sau khi di cư thành công cho khác thay đổi lược đồ, vì vậy những thay đổi đó có thể không có vấn đề gì cả. Các giá trị -1 được thay thế một cách uể oải bởi các giá trị tối đa thích hợp. Cột bổ sung có thể được sử dụng trong quá trình di chuyển.

  • Trong trường hợp của tôi, siêu kiểu của thực thể mới có mối quan hệ với nhiều thứ tự. Trong trường hợp rất đơn giản, nơi lưu trữ toàn bộ dữ liệu chỉ chứa một cá thể đối tượng (một cá thể của kiểu thực thể đó không có các liên kết mối quan hệ đi), việc di chuyển lược đồ thành công. Nó có thêm Z2_MYOBJECT cột và Z_PRIMARYKEY.Z_MAX = -1 giá trị và cửa hàng dữ liệu kết quả hoạt động tốt khi thêm đối tượng từ đó.

  • Tôi đã thử tạo mô hình ánh xạ nhưng không thành công trong việc lấy Dữ liệu cốt lõi để áp dụng nó. Tắt ánh xạ phỏng đoán vừa làm cho Dữ liệu cốt lõi không thể di chuyển được. Có mẹo nào không? Tôi có phải viết mã di chuyển tùy chỉnh để gọi một mô hình ánh xạ không? Đây là Xcode 4.6.2 do đó lỗi cũ hơn đã biến mất.

  • Khi sử dụng git để cuộn mã & mô hình dữ liệu lùi hoặc tiến hành thử nghiệm, có vẻ cần thiết (1) đóng & mở lại dự án Xcode và (2) làm sạch. Nếu không, Xcode có thể bị lỗi và/hoặc để lại trạng thái gây nhiễu xung quanh. Để thử nghiệm cuộn lùi, bạn phải xóa thư mục .momd/ hoặc toàn bộ ứng dụng từ trình mô phỏng/thiết bị iOS mục tiêu (hoặc triển khai ứng dụng qua iTunes hoặc TestFlight) kể từ khi triển khai lại thông qua Xcode sẽ không xóa các tệp lỗi thời (như .mom). và .omo định nghĩa mô hình dữ liệu) để cho phép ứng dụng thực hiện di chuyển nhẹ mà ứng dụng được triển khai thực tế không thể thực hiện được.

  • Giới thiệu về ánh xạ thực thể để sử dụng cho loại thực thể bổ sung, lưu ý rằng khi dữ liệu lõi áp dụng mô hình ánh xạ, nó sao chép thực thể từ kho dữ liệu cũ sang kho dữ liệu mới. Nó không sửa đổi các bảng tại chỗ. Bạn không muốn nó "bỏ qua" thuộc tính (bao gồm các thuộc tính kế thừa) trừ khi bạn muốn thả chúng.

  • Tuy nhiên, do thay đổi giản đồ thêm loại thực thể, thực thể đó không có trường hợp để di chuyển nên quy tắc mô hình ánh xạ tùy chỉnh của nó không quan trọng.

Vì vậy, tôi tự hỏi nếu có điều gì khác khiến lỗi của bạn dừng lại, như tệp di chuyển còn lại .mom hoặc mã di chuyển tùy chỉnh. Cách giải quyết của bạn có được duy trì không?

Sau 2 ngày thử nghiệm, tôi đã quyết định người thử nghiệm alpha của mình sẽ phải sống mà không cần di chuyển dữ liệu lần này. May mắn thay điều này xảy ra mà không có khách hàng sản xuất. Nhưng nó không cho tôi niềm tin vào Core Data.

+0

Cảm ơn bạn đã thêm thông tin. Sau khi vượt qua vấn đề được lưu ý ở đây, mỗi câu trả lời của tôi, tôi đã gặp phải một vấn đề định kỳ khác đã thu hút sự chú ý của tôi: (http: // stackoverflow.com/questions/10894383/core-data-mapping-model-version-băm-không-phù hợp-với-nguồn-mô hình-phiên bản-băm). Câu trả lời được cung cấp cho câu hỏi đó không giải quyết được vấn đề cho tôi, vì vậy tôi đã thêm tiền thưởng cho nó, nhưng không có phản hồi. Tôi đã không báo cáo lỗi kể từ khi tôi đã hy vọng tham dự một phiên họp dữ liệu cốt lõi tại một hội nghị Cocoa địa phương vào tháng trước và xem các chuyên gia có biết một giải pháp hay không. Thật không may, tôi đã không thể tham dự. –

+0

Nói chung, bạn không cần phải viết mã di chuyển tùy chỉnh, tuy nhiên có một vài điều có thể ngăn mô hình ánh xạ hoạt động. Một được đề cập trong câu hỏi mà tôi đã liên kết trong bình luận ở trên của tôi. Bạn sẽ muốn kiểm tra các hash trong mô hình ánh xạ so với các hash trong tệp dữ liệu nguồn của bạn và phiên bản mô hình hoạt động. Kiểm tra câu trả lời cho câu hỏi này để biết chi tiết về cách bật gỡ lỗi Core Data nếu bạn chưa làm như vậy: http://stackoverflow.com/questions/12835950/debug-core-data-migration-to-compare-hash-values –

1

Tôi đã có cùng một loại NSRangeException sau khi thêm phiên bản mô hình dữ liệu lõi khi truy cập vào bất kỳ phiên bản nào của một thực thể cụ thể sau khi di chuyển nhẹ tự động. Trong trường hợp của tôi cũng phạm vi tương ứng với số lượng thực thể trong mô hình của tôi.

Tôi đã tạo mô hình ánh xạ với Xcode 4.6 (4H127) bằng cách sử dụng File > New > File... và sau đó chọn Core Data > Mapping Model. Điều này gây ra vụ tai nạn để (d) phát triển thành -[NSSymbolicExpression length]: unrecognized selector sent to instance...

Giải pháp

Các vấn đề trong trường hợp của tôi là thực thể của tôi gây ra tai nạn ban đầu có một mối quan hệ có tên size, đó là một từ dành riêng liệt kê trong táo của Predicate Programming Guide . Một nghiên cứu về các mô hình lập bản đồ tiết lộ rằng từ Reserved đã được vốn hóa trong Biểu giá trị gia tăng cho mối quan hệ:

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "PNSizeOptionToPNSizeOption", $source.SIZE)

Tôi tìm thấy giải pháp trong Core Data Model Versioning and Data Migration Programming Guide:

từ dành riêng trong các biểu thức giá trị tùy chỉnh : Nếu bạn sử dụng biểu thức giá trị tùy chỉnh , bạn phải thoát các từ dành riêng như SIZE, FIRST và LAST bằng cách sử dụng # (ví dụ: $ source. # Size).

Thật không may, thuật toán Xcode để tạo mô hình ánh xạ không nhận ra từ dành riêng và tôi phải thay đổi đường dẫn khóa của biểu thức trong thanh tra Bản đồ mối quan hệ thành $source.#size. Điều này giải quyết được vấn đề. Tôi giả định rằng mô hình ánh xạ suy luận của dữ liệu lõi chạy vào một vấn đề tương tự trong quá trình di chuyển nhẹ.

Có thể có nguyên nhân khác gây ra sự cố loại này và vì vậy giải pháp này có thể không áp dụng, nhưng bạn có thể kiểm tra tên thuộc tính trong mô hình của mình dựa trên danh sách các từ dành riêng trong Predicate Programming Guide.

Các vấn đề liên quan