2013-06-11 37 views
8

Tôi đã tạo mô hình mới và đổi tên thành 2 trường của thực thể. Thực thể này chưa bao giờ được sử dụng trong phiên bản ứng dụng trước, vì vậy tôi đã không ánh xạ đối tượng đó với thực thể được cập nhật mới trong cơ sở dữ liệu. Do đó ánh xạ không phải là ánh xạ bất cứ điều gì mới, nhưng việc di chuyển rất chậm (3 giây cho khoảng 50 hàng trong bảng chính.). Tôi tự hỏi nếu dữ liệu cốt lõi đang tạo ra một cơ sở dữ liệu mới và xóa một cơ sở dữ liệu cũ hơn, và reinserting tất cả dữ liệu. Đây là tệp nhật ký di chuyển: http://cl.ly/3H1v252R1p1cDi chuyển dữ liệu lõi chậm mặc dù không có gì để di chuyển

ps. Nếu NSInferMappingModelAutomaticallyOption là CÓ, điều này có nghĩa là tôi có khả năng có thể gặp phải mất mát dữ liệu, vì ánh xạ được ứng biến bởi dữ liệu cốt lõi?

cảm ơn

Trả lời

3

Bạn có thể hiển thị cho chúng tôi lược đồ cơ sở dữ liệu của bạn không? Tôi đoán là bạn đã sử dụng sự thừa kế đối tượng trong nó một cách tự do.

Dữ liệu cốt lõi thực hiện kế thừa trong các cửa hàng SQL bằng cách tạo một bảng đơn cho thực thể cha và thêm cột cho liên kết của tất cả các trường được các thực thể con sử dụng. Vì vậy, bạn có thể nghĩ rằng bạn đã đổi tên chỉ hai trường trên một thực thể nhưng Dữ liệu cốt lõi phải áp dụng các thay đổi cho mọi đối tượng kế thừa từ thực thể đó hoặc có tổ tiên chung của thực thể đó.

Trong lược đồ cụ thể của bạn, có vẻ như bạn có một thực thể, Mục, từ đó ít nhất là Thể loại, AudioTrack, Studio, Giám đốc, Cửa hàng, Phim, Điều kiện, Khu vực, Chủ sở hữu, AspectRatio, Năm, MyRating, Tập, Ấn bản, Định dạng, nhà sản xuất, nhà văn, AudienceRating, SeenIt và Movie xuống. Có thể có những người khác khi tôi đọc nhật ký của bạn bằng mắt thay vì phân tích nó tự động. Vì vậy, Core Data tạo ra một bảng có tên Item, trong đó mỗi cá thể của mỗi một thực thể đó đều được lưu trữ. Bất cứ khi nào một trong những thực thể đó (hoặc những người khác mà tôi có thể không tìm thấy) thay đổi, Core Data phải cập nhật các bản ghi cho tất cả các cá thể của mỗi một thực thể đó.

Đó là lý do tại sao bạn thấy:

CREATE TABLE ZITEM (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, 
ZUNIQUEID INTEGER, ZCOLLECTIONSTATUS INTEGER, ZHASCOVER INTEGER, ZINDEX INTEGER, 
ZPLOTNOTE INTEGER, ZUSERVALUES INTEGER, ZPURCHASEDATEDAY INTEGER, 
ZPURCHASEDATEMONTH INTEGER, ZPURCHASEDATEYEAR INTEGER, ZRELEASEDATEDAY INTEGER, 
ZRELEASEDATEMONTH INTEGER, ZRUNTIME INTEGER, ZVIEWINGDATEDAY INTEGER, 
ZVIEWINGDATEMONTH INTEGER, ZVIEWINGDATEYEAR INTEGER, ZAUDIENCERATING INTEGER, 
ZCONDITION INTEGER, ZEDITION INTEGER, ZFORMAT INTEGER, ZLOANER INTEGER, 
ZLOCATION INTEGER, ZMYRATING INTEGER, ZOWNER INTEGER, ZSEARCH INTEGER, 
ZSEENIT INTEGER, ZSEENWHERE INTEGER, ZSERIES INTEGER, ZSTORAGEDEVICE INTEGER, 
ZSTORE INTEGER, ZYEAR INTEGER, ZRANK INTEGER, ZTYPEID INTEGER, 
ZCOLLECTIBLE INTEGER, Z3_COLLECTIBLE INTEGER, ZBIN INTEGER, ZSORTORDER INTEGER, 
ZSECTION VARCHAR, ZCLZID VARCHAR, ZCONNECTHASH VARCHAR, ZSORTTITLE VARCHAR, 
ZTITLE VARCHAR, ZACTORS VARCHAR, ZCLZMEDIAID VARCHAR, ZCURRENTVALUE VARCHAR, 
ZIMDBNUMBER VARCHAR, ZIMDBRATING VARCHAR, ZLOANDATE VARCHAR, ZLOANDUEDATE VARCHAR, 
ZPURCHASEPRICE VARCHAR, ZSTORAGESLOT VARCHAR, ZTITLEEXTENSION VARCHAR, 
ZUPC VARCHAR, ZTHEDESCRIPTION VARCHAR, ZURL VARCHAR, ZDISPLAYNAME VARCHAR, 
ZSORTNAME VARCHAR) 

Đó là bảng chứa sự kết hợp của tất cả các lĩnh vực của tất cả các hậu duệ của Item. Đó cũng là lý do tại sao ví dụ:tìm nạp cho AudienceRatings được thực hiện như sau:

SELECT t0.Z_ENT, t0.Z_PK, t0.Z_OPT, t0.ZSECTION ... FROM ZITEM t0 WHERE t0.Z_ENT = ? 

Vì vậy:

  • Lõi Dữ liệu được cập nhật nhiều hơn 50 hàng;
  • nếu bạn muốn tránh điều này, bạn cần phải tránh thừa kế;
  • bạn có thể tránh 'là' mối quan hệ với 'có' mối quan hệ nhưng bản chất hai chiều của dữ liệu lõi thường làm cho điều đó đau (nếu 30 đối tượng có kết nối đến mục thì mục phải có 30 kết nối với các đối tượng khác) ;
  • nếu mục chỉ là thứ gì đó tầm thường như dấu thời gian thống nhất, việc thêm dấu thời gian vào mọi thực thể thường dễ dàng hơn và mỗi lần gọi một đoạn mã chung để thiết lập nó.
+0

Xin chào, Có, tôi có một thực thể cha mẹ với nhiều trẻ em (http://cl.ly/image/3T3Z1N0M2v18), nhưng thực thể này chưa được sửa đổi. Tôi đã thực sự chỉ cần đổi tên 2 lĩnh vực của bảng Liên kết, nhưng các lĩnh vực này đã không được ánh xạ từ cũ sang mô hình mới (vì vậy tôi không cần phải reinsert bất kỳ dữ liệu!). Cơ sở dữ liệu chỉ nên giữ nguyên như vậy, vì các trường được đổi tên thuộc về một bảng trống. – aneuryzm

+0

Trong kho dữ liệu lõi của SQL, nếu 'A' và' B' xuất phát từ 'X' thì có một bảng đơn có tên' X' trong đó các thể hiện của cả hai 'A' và' B' được lưu trữ. Vì vậy, nếu bạn cập nhật thực thể 'B' thì Core Data phải tái xử lý tất cả các trường hợp của cả hai' A' và 'B' bởi vì nó phải cập nhật bảng' X'. Trong trường hợp của bạn, sự nghi ngờ của tôi là số lượng các phiên bản được cập nhật kết thúc là đáng kể. – Tommy

+0

Đây là câu trả lời đúng. Bạn có thể nghĩ rằng bảng trống, nhưng nó không phải là. Có iad thực sự chỉ có 1 bảng chứa tất cả mọi thứ (vì thừa kế thực thể của bạn). – Wain

3

Dữ liệu cốt lõi trên iOS sử dụng SQLite để lưu trữ dữ liệu. SQLite không hỗ trợ ALTER COLUMN, vì vậy Core Data việc khắc phục hạn chế này bằng cách:

  1. đổi tên bảng cũ
  2. tạo ra một bảng mới với các cột được cập nhật
  3. chèn các bản ghi vào bảng mới
  4. thả bảng cũ

Có một câu trả lời SO tốt here mô tả chi tiết này chi tiết hơn một chút.

Tôi chưa bao giờ thấy bất kỳ vấn đề nào với Dữ liệu cốt lõi bị mất dữ liệu khi thực hiện thao tác này - tôi cho rằng Apple đã thực hiện các biện pháp bảo vệ để ngăn chặn điều này, nhưng có thể liên hệ trực tiếp với Apple DTS để xác nhận.

+0

Tuy nhiên tôi không ánh xạ các trường được đổi tên, do đó, nó không nên đưa lại bất kỳ trường nào. – aneuryzm

+0

2 trường được đổi tên thuộc về một bảng trống. – aneuryzm

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