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:
- 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.
- 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ổ sungZ2_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. - Trong bảng
Z_PRIMARYKEY
, tất cả các mục nhập sau di chuyển hiển thị-1
choZ_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ôngZ_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?
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? –
@ 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. –
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 –