2010-06-20 30 views
7

cơ bản bố trí ứng dụng bằng cách sử dụng mẫu điều khiển chuyển hướng với ngày lõi:Core Data lấy yêu cầu không thành công với: 'NSInternalInconsistencyException', lý do: 'tuyên bố vẫn đang hoạt động'

đại biểu: persistenceCoordinator, managedObjectModel, managedObjectContext

  • RootView: managedObjectContext (từ đại biểu), addManagedObjectContext (sử dụng mẫu từ các mẫu), fetchResultsController
    • Thêm/sửa chế độ xem (phân cấp để thêm đối tượng A & B của nó)

Tôi có hai đối tượng, A & B có chung một 1-to-1 mối quan hệ/mối quan hệ nghịch đảo

Sử dụng mô hình từ các mẫu ứng dụng:

  1. Tạo một addManagedObjectContext
  2. Chèn một thực thể A
  3. Bật/Thêm A vie w (đã thông qua nó thực thể chèn)

EXCEPTION BƯỚC 1:

Nếu tôi chỉ đơn giản là điền vào một thuộc tính và lưu tất cả mọi thứ hoạt động tốt.

  • Các đối tượng được đưa vào cơ sở dữ liệu (xác minh với sqlite3 trên dòng lệnh)
  • Các cập nhật fetchResultsController xem danh sách
  • tôi có thể đóng và mở ứng dụng (full đóng/mở không chỉ chuyển đổi ứng dụng) và chế độ xem danh sách sẽ tìm nạp lại chính xác

Nếu sau đó tôi chỉnh sửa A, tôi có thể chọn Thêm B và chế độ xem B bổ sung được bật (Và đã thông qua một thực thể)

  • Điền vào chi tiết B và lưu
  • B được đưa vào A managedObjectContext, mối quan hệ được thiết lập, và bối cảnh được lưu
  • Quan điểm bật tắt và tất cả dường như cũng
  • các đối tượng đều trong cơ sở dữ liệu với mối quan hệ đúng
  • tôi có thể tải lại các bản ghi và xem mối quan hệ, thực hiện chỉnh sửa, vv
  • NGOẠI TRỪ: Nếu tôi đóng/mở lại ứng dụng, để kích hoạt tìm nạp, thì lỗi được đề cập trong tiêu đề sẽ xuất hiện .

EXCEPTION BƯỚC 2:

Nếu tôi điền vào một thuộc tính VÀ B thuộc tính trong đầu "add"

  • Saving B gây nên một đầy đủ tiết kiệm của bối cảnh A (như trên)
  • Lưu khoản tiết kiệm qua ủy quyền mối quan hệ được thiết lập bởi mẫu (và hợp nhất kết quả vào managedObjectContext chính v.v.)
  • Các đối tượng được đưa vào cơ sở dữ liệu đúng
  • Tuy nhiên fetchResultsController KHÔNG cập nhật để hiển thị các kỷ lục mới
  • EXCEPTION: Nếu tôi đóng/mở lại ứng dụng, để kích hoạt một lấy, thì lỗi được đề cập trong tiêu đề sẽ xuất hiện .

Tôi đã thử lưu A đầu tiên, thêm ngữ cảnh riêng biệt cho B v.v .. v.v. Tôi nhầm lẫn khi nói ít nhất. Mọi sự trợ giúp sẽ rất được trân trọng.

Chúc mừng, Ryan

Trả lời

4

Nghe có vẻ như bạn có hai hoặc quản lý nhiều bối cảnh đối tượng khi bạn chỉ cần một.

Tôi không biết tại sao bạn sẽ có một phương thức được gọi là addManagedObjectContext trong RootViewController hoặc những gì nó sẽ làm. Trong tất cả các thiết kế phức tạp nhất, bạn chỉ có một bối cảnh tại một thời điểm và chúng không chồng lên nhau. Ngữ cảnh/s nên được tổ chức bởi các đại biểu ứng dụng hoặc một đối tượng mô hình chuyên dụng. Bạn sẽ không bao giờ tạo ngữ cảnh mới mỗi khi bạn mở một chế độ xem cụ thể.

Bạn có thể có ngữ cảnh khác nhau, tất cả đều ghi vào cùng một kho lưu trữ liên tục nên tôi nghĩ đây là lý do bạn thấy dữ liệu trong cửa hàng. Tuy nhiên, bạn không thể duy trì tính toàn vẹn của đồ thị trong ngữ cảnh nếu bạn đặt một đối tượng trong mối quan hệ trong một ngữ cảnh và phía bên kia của mối quan hệ trong ngữ cảnh khác. Tôi tin rằng đây là những gì đang tạo ra lỗi của bạn.

+0

Có ngữ cảnh thêm giữ tất cả thay đổi trong ngữ cảnh chính cho đến khi bạn hợp nhất chúng. Nó hoàn toàn hợp lý. Sự cố là vấn đề về luồng với một trong các đối tượng được quản lý của tôi. Một sai lầm ngớ ngẩn không liên quan đến bối cảnh hoặc luồng ứng dụng. Cảm ơn mọi người. Tôi đánh giá cao những suy nghĩ. –

+0

Xin lỗi, theo tên phương thức, tôi nghĩ rằng bạn đã "thêm ngữ cảnh khác" và không có "ngữ cảnh để thêm đối tượng". Vì lợi ích của độc giả trong tương lai, bạn có thể muốn chỉnh sửa câu hỏi của mình để phản ánh điều đó. – TechZen

+1

Có nhiều hơn một bối cảnh chỉ để ném các đối tượng đi là một ** cạnh ** trường hợp tốt nhất. Nó không phải là "hoàn toàn hợp lý" nhưng một ví dụ xấu không may tồn tại trong một trong các dự án nguồn mẫu của Apple. 'NSUndoManager' là những gì nên được sử dụng cho các tình huống vứt bỏ. –

3

Lỗi này thường có liên quan đến luồng và có thể có nghĩa là một số thứ vẫn đang xử lý trên một chuỗi khác. Trong trường hợp của tôi, tôi đã làm một cái gì đó ngu ngốc trong init của một đối tượng được quản lý (không ghi đè init;)).

+1

Đây là vấn đề của tôi, mặc dù luồng của tôi là chính xác, tôi đã ghi đè phương pháp khởi tạo của một NSManagedObject đang phá vỡ mọi thứ. – BenV

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