2010-09-05 18 views
7

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ệ, nextprevious 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?

Trả lời

0

Vì iOS 5 bạn có thể (và nên) sử dụng NSOrderedSet và lớp con có thể thay đổi của nó. → Core Data Release Notes for OS X v10.7 and iOS 5.0

Xem câu trả lời được chấp nhận tại How can I preserve an ordered list in Core Data.

+1

Đú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). –

+0

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 :-/ –

4

Nếu thứ tự tùy ý tức là không cố hữu trong dữ liệu đang được lập mô hình, thì bạn không còn cách nào khác ngoài việc thêm thuộc tính hoặc mối quan hệ để duy trì thứ tự.

Tôi sẽ tư vấn danh sách được liên kết vì nó dễ bảo trì nhất. Tôi không chắc chắn những gì bạn có nghĩa là bởi một danh sách liên kết được khó khăn để sắp xếp vì bạn sẽ không có nhiều khả năng sẽ không được phân loại trên một trật tự tùy ý anyway. Thay vào đó, bạn sẽ chỉ tìm nạp hầu hết các trường hợp và đi theo con đường của bạn.

Đặt hàng theo thuộc tính float chia được là một ý tưởng hay. Bạn có thể tạo số lượng chỉ mục trung gian gần vô hạn bằng cách trừ chỉ số hiện tại thấp hơn khỏi chỉ mục hiện tại cao hơn, chia kết quả cho hai và sau đó thêm kết quả đó vào chỉ mục thấp hơn.

Bạn cũng có thể kết hợp chỉ mục chia hết với danh sách được liên kết nếu bạn cần đặt hàng cho các bảng hoặc tương tự. Danh sách được liên kết sẽ giúp bạn dễ dàng tìm thấy các chỉ mục hiện có và chỉ mục chia được sẽ giúp bạn dễ dàng sắp xếp nếu bạn cần.

Dữ liệu cốt lõi chống lại loại đặt hàng này vì thường không cần thiết. Bạn không muốn thêm cái gì đó vào mô hình dữ liệu trừ khi nó là cần thiết để mô phỏng đối tượng, sự kiện hoặc điều kiện thế giới thực mà mô hình mô tả.Thông thường, sắp xếp/sắp xếp không cố hữu với mô hình mà chỉ cần giao diện người dùng/chế độ xem. Trong trường hợp đó, bạn nên có logic sắp xếp trong bộ điều khiển giữa mô hình và khung nhìn.

Suy nghĩ cẩn thận trước khi thêm thứ tự vào mô hình khi bạn có thể không cần đến.

+0

Nếu sử dụng danh sách được liên kết, bạn sẽ thiết lập bộ mô tả sắp xếp Dữ liệu chính như thế nào? Một điểm của việc sử dụng dữ liệu lõi (cụ thể là một 'NSFetchedResultController') là nó sẽ cho bạn kết quả của một truy vấn theo đúng thứ tự nếu bạn cung cấp nó với một bộ mô tả sắp xếp. –

+0

Thứ tự sắp xếp vốn có trong dữ liệu, chỉ do người dùng quyết định. Hãy suy nghĩ ví dụ rằng bạn muốn cho phép người dùng quyết định thứ tự mà anh ấy muốn sách của cô ấy đặt lên giá. Cô ấy có thể quyết định di chuyển một cuốn sách từ vị trí 7 đến giữa vị trí 14 và 15. Hoặc để bán sách ở vị trí 12 hoặc mua một cuốn sách mới và chèn nó vào vị trí 3. Ngày hôm sau, cô ấy sẽ quyết định di chuyển cuốn sách đó đến cuối kệ. Giao diện người dùng để thực hiện điều đó rất dễ dàng bằng cách sử dụng 'UITableView'. Vấn đề của tôi là với sự đại diện tốt nhất của một "giá trị ưu tiên" như vậy để thực hiện trao đổi/chèn/xóa dễ dàng và đủ nhanh. –

+0

Tôi nghĩ rằng một danh sách liên kết kết hợp với chỉ số chia hết sẽ là nhanh nhất. Đối với tốc độ lớn hơn, tôi sẽ di chuyển thứ tự đến một thực thể nhẹ khác với mối quan hệ với thực thể bạn muốn đặt hàng. Thực hiện tìm nạp và sắp xếp của bạn trên thực thể nhẹ và sau đó tải thực thể được liên kết nếu cần. – TechZen

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