Câu hỏi này nằm trong ngữ cảnh của Dữ liệu cốt lõi, nhưng nếu tôi không nhầm, nó cũng áp dụng tốt cho một trường hợp SQL tổng quát hơn.Làm thế nào để duy trì một bảng có thứ tự với Dữ liệu cốt lõi (hoặc SQL) với chèn/xóa?
tôi muốn duy trì một bảng ra lệnh sử dụng Core Data, với khả năng cho người dùng:
- hàng sắp xếp lại
- chèn dòng mới bất cứ nơi nào
- xóa bất kỳ dòng hiện
Mô hình dữ liệu tốt nhất để làm điều đó là gì? Tôi có thể thấy hai cách:
1) Xây dựng mô hình nó như một mảng: Tôi thêm một tài sản int position
để thực thể của tôi
2) Mô hình nó như là một danh sách liên kết: tôi thêm hai one-to-one quan hệ, next
và previous
từ thực thể của tôi để tự
1) giúp bạn dễ dàng sắp xếp, nhưng đau đớn để chèn hoặc xóa như bạn thì phải cập nhật position
của tất cả các đối tượng mà đến sau
2) giúp bạn dễ dàng chèn hoặc xóa, nhưng rất khó để sắp xếp. Trong thực tế, tôi không nghĩ rằng tôi biết làm thế nào để thể hiện một Descriptor sắp xếp (SQL ORDER BY
khoản) cho trường hợp đó.
Bây giờ tôi có thể tưởng tượng một biến thể của 1):
3) thêm một ordering
tài sản int đến tổ chức nào, nhưng thay vì có nó đếm một-by-một, có nó đếm 100 100 (ví dụ). Sau đó chèn đơn giản như tìm bất kỳ số nào giữa thứ tự của các đối tượng trước đó và tiếp theo. Việc đổi số đắt tiền chỉ xảy ra khi 100 lỗ đã được lấp đầy. Làm cho thuộc tính đó trở thành một float thay vì một int làm cho nó thậm chí còn tốt hơn: hầu như luôn có thể tìm thấy một float mới nằm giữa hai float.
Tôi đang đi đúng hướng với giải pháp 3) hay có điều gì thông minh hơn?
Đúng. Bạn đào ra một câu hỏi cũ, và bạn đúng :-). Mặc dù một số vấn đề với NSOrderedSet (trong đó có một API đó là ít hơn hoàn thành hơn NSArray ví dụ) và các mối quan hệ đặt hàng (mà tôi tin rằng không được hỗ trợ đầy đủ bởi bộ điều khiển kết quả tìm nạp). –
Vâng, tôi đã cố gắng nhận NSFetchedResultsController để làm việc với một mối quan hệ đặt hàng. Thành công cho hầu hết các phần - nhưng không cập nhật thông minh xem bảng, tức là chèn hoặc xóa động, thay vì chỉ làm '[tableView reloadData]'… Vì vậy, cuối cùng tôi đã bỏ qua các bộ điều khiển kết quả tìm nạp và chỉ tìm nạp trước toàn bộ danh sách :-/ –