2013-04-12 27 views
6

Tôi đã dành vài giờ trên một dữ liệu đó và dường như tôi không thể tìm ra giải pháp. Thứ nhất, một số chi tiết kỹ thuật của những gì tôi có:Dữ liệu cốt lõi không thống nhất - tìm nạp đôi khi không trả lại gì cả

  • Objective-C iOS 6 ứng dụng với Core Dữ liệu
  • Lõi được khởi tạo từ UIManagedDocument, trong đó có ô tô tiết kiệm bật
  • ManagedContext từ UIManagedDocument được lưu trữ trong một biến tĩnh và được tái sử dụng trong suốt ứng dụng
  • Ứng dụng sử dụng RestKit và tôi sử dụng danh mục ActiveRecord mà nó cung cấp.

Tôi có mô hình với thực thể Nhóm. Trong ứng dụng, có một bộ điều khiển xem danh sách nhóm, sẽ tải các nhóm từ phần phụ trợ. Phần phụ trợ trả về mảng JSON, chứa trong số những người khác, ID nhóm. Tôi lưu trữ ID này trong trường "id" trong mô hình của mình và trong khi lặp lại qua phản hồi của máy chủ, tôi tra cứu xem nhóm có ID đã cho đã tồn tại chưa. Nếu có, tôi chỉ cập nhật thông tin của nó và vượt qua đối tượng, nếu không - tôi tạo nó trước.

Và đây là nơi nó biến kỳ quái. Điều này làm việc 90% thời gian. Tôi có thể tải lên bộ điều khiển danh sách nhóm, đi xa hơn trong ứng dụng, quay trở lại bộ điều khiển (tải lại dữ liệu) và mọi thứ đều ổn cả phần lớn thời gian. Tuy nhiên, thỉnh thoảng, yêu cầu tìm nạp của tôi sẽ không trả về gì cả. Như trong:

NSArray *results = [context executeFetchRequest:request error:&error]; 

sẽ trả về mảng trống và lỗi cũng trống. Không có gì trên máy chủ đang thay đổi. Các yêu cầu, khi tôi cố gắng để gỡ lỗi nó, trông giống như sau:

<NSFetchRequest: 0x127a0e20> (entity: Team; predicate: (id == "123"); sortDescriptors: ((null)); limit: 1; type: NSManagedObjectResultType;) 

Khi tôi xem trước các cửa hàng sqlite trong một ứng dụng bên ngoài, tôi có thể thấy rằng mục Đội bóng cho ID này là hiện tại, và trong 90% còn lại lần nó thực sự được nạp. Điều gì thậm chí còn kỳ lạ hơn nữa, khi tôi đã bật SQLDebug trên tôi có thể thấy:

2013-04-12 12:00:27.934 SportLink[10831:c07] CoreData: annotation: fetch using 
NSSQLiteStatement <0x12656d10> on entity 'Team' with sql text 'SELECT 0, t0.Z_PK, 
t0.Z_OPT, t0.ZACI1, t0.ZACI2, t0.ZACI3, t0.ZALTFIRSTNAME, t0.ZALTSECONDNAME, t0.ZCOLOR1, 
t0.ZCOLOR2, t0.ZGENDER, t0.ZICON, t0.ZID, t0.ZLOCATION, t0.ZLOGO1, t0.ZLOGO2, t0.ZNAME, 
t0.ZTYPE, t0.ZSPORT FROM ZTEAM t0 WHERE t0.ZID = ? LIMIT 133' returned 6 rows 

có nghĩa là cửa hàng sao lưu thực sự tìm nạp dữ liệu, nhưng vì một lý do nào đó không vượt qua nó. Bây giờ là:

  • tôi đang làm tất cả mọi thứ trong các chủ đề chính, vì vậy đây không phải là một vấn đề
  • Tôi tin rằng lưu tự động cũng không phải là một vấn đề, bởi vì điều này có thể xảy ra ngay cả khi tôi đóng ứng dụng và mở nó một lần nữa với dữ liệu đã có.

Mọi ý tưởng về những gì đang xảy ra ở đây?

Chỉnh sửa: Tôi đã lược tả ứng dụng bằng Công cụ. Tôi vừa bước vào VC có vấn đề, sau đó bước vào bộ điều khiển con của nó và rời đi, lặp đi lặp lại điều này một vài lần cho đến khi vấn đề bắt đầu xuất hiện. Đây là kết quả. Có lẽ nó sẽ được dễ dàng hơn để biết những gì đang xảy ra từ đây:

Instruments output

+0

Khi nào bạn kích hoạt yêu cầu trong 'TeamListVC'? Bạn đang làm gì khi kết quả đã được tải? Bạn cũng có thể ghi lại '[kết quả đếm]' sau khi yêu cầu của bạn để theo dõi nhiều hơn một chút. – flashfabrixx

+0

thử thiết lập độ chính xácTự động của bối cảnh chính thành 0 –

+0

@DanShelly tiếc là điều này không giúp ích gì. – mav

Trả lời

5

Sau vài ngày điều tra, cuối cùng tôi đã tìm thấy nguyên nhân gây ra lỗi này. Các mã được lấy Đội thực thể trông như thế này:

Team *team = [Team findFirstByAttribute:WSK_ID withValue:data[WSK_ID] inContext:moc]; 

WSK_ID chỉ là một định nghĩa cho @"id" là.data là một từ điển mà tôi nhận được từ RestKit, từ một phản hồi JSON. Bởi vì nó không được chuyển sang bất kỳ loại nào, nó có thể là một NSString, trong khi tài sản id của thực thể Team đang mong đợi NSNumber. Mặc dù đôi khi tôi không biết điều gì chỉ thất bại, hãy thay đổi bit này thành:

Team *team = [Team findFirstByAttribute:WSK_ID withValue:@([data[WSK_ID] intValue]) inContext:moc]; 

I.e. đúc chuỗi ID thành int, và sau đó boxing nó với NSNumber cố định vấn đề.

+0

Sqlite3 trên iOS hoàn toàn khủng khiếp khi nói đến interop, loại chuyển đổi, v.v. - cho dù bạn có sử dụng CoreData hay không. Theo kinh nghiệm của tôi, tôi thấy rằng trong khi CoreData hữu ích trong các tình huống đơn giản, nó cũng làm tăng thêm độ phức tạp bằng cách ẩn một số dữ liệu nhất định. – Brandon

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