2013-01-24 27 views
5

Ứng dụng của tôi có db dữ liệu cốt lõi được điền khi lần khởi chạy đầu tiên để sử dụng ngoại tuyến. Sau đó, db này được đồng bộ hóa trong mỗi lần khởi chạy với một db trực tuyến. Chỉ lần khởi chạy đầu tiên chứa một lượng dữ liệu đáng kể. Ứng dụng cũng tìm nạp một số hình ảnh từ web, sau đó được chuyển đổi sang dữ liệu nhị phân và được lưu vào dữ liệu cốt lõi để sử dụng ngoại tuyến. Điều này chỉ xảy ra khi người dùng điều hướng đến một phần chứa một số hình ảnh và chỉ những hình ảnh đó được tìm nạp (ứng dụng không tìm nạp tất cả các hình ảnh cùng một lúc, chỉ khi chúng cần thiết).Dữ liệu chính "không sao lưu" cờ

Tôi đang sử dụng Bản ghi Magical.

Tôi không lưu bất kỳ loại dữ liệu nào để lưu vào thời gian chạy. Tuy nhiên ứng dụng của tôi đã bị từ chối với thông báo này:

Chúng tôi nhận thấy rằng ứng dụng của bạn không tuân theo Nguyên tắc lưu trữ dữ liệu iOS, bắt buộc theo Nguyên tắc đánh giá của App Store.

Nó khuyên tôi nên kiểm tra "Cài đặt> iCloud> Bộ nhớ & Sao lưu> Quản lý bộ nhớ" nhưng ứng dụng của tôi thậm chí không hiển thị.

Tôi hiểu rằng tôi nên đánh dấu dữ liệu cốt lõi không phải để chuyển sang iCloud, nhưng tôi không hiểu cách thực hiện việc này. Giả sử tôi nên thực hiện một cái gì đó như thế này, nhưng không biết làm thế nào để áp dụng nó vào các tập tin dữ liệu cốt lõi của tôi.

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { 
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

NSError *error = nil; 
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] 
           forKey: NSURLIsExcludedFromBackupKey error: &error]; 
if(!success){ 
    NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); 
} 
return success; } 

Trả lời

1

Find: NSPersistentStoreCoordinator+MagicalRecord.m

Sau đó, tìm:

- (NSPersistentStore *)MR_addSqliteStoreNamed:(id)storeFileName withOptions:(__autoreleasing NSDictionary *)options 

Ở dưới cùng của phương pháp này, bạn sẽ thấy:

if (!store) 
{ 
    [MagicalRecord handleErrors:error]; 
} 

Thay đổi đó để:

if (!store) 
{ 
    [MagicalRecord handleErrors:error]; 
} 
else 
{ 
    [self addSkipBackupAttributeToItemAtURL:url]; 
} 

Hãy cho tôi biết nếu phương pháp này có vẻ khác nhau đối với bạn, nhưng đây là những gì tôi sử dụng để thực hiện của riêng tôi. Chỉ cần chắc chắn rằng bạn thả vào chức năng mà bạn đề cập trong câu hỏi của bạn.

+1

Nếu MagicalRecord đang được sử dụng làm Pod, điều này sẽ không bị ghi đè bất cứ khi nào chúng tôi kéo cập nhật cho Pod này? – Matt

2

Dưới đây có thể tốt hơn thay đổi tệp nguồn của MacigalRecord. Trong swift

MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("somedb.sqlite") 
let dbPath = NSPersistentStore.MR_urlForStoreName("somedb.sqlite") 
do { 
    try dbPath.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey) 
} catch let error { 
    print(error) 
} 
+0

Đây là con đường để đi. Đối với những người mục tiêu C: 'NSURL * dbURL = [NSPersistentStore MR_urlForStoreName: @" storename "]; Lỗi NSError * = nil; BOOL thành công = [dbURL setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey lỗi: & error]; ' – Richard

+0

Tôi đề xuất loại trừ toàn bộ thư mục khỏi bản sao lưu, không chỉ .sqlite. Nếu không, các tệp DB ghi nhật ký sẽ được đưa vào bản sao lưu. Nếu tôi nhớ rõ thì MagicalRecord tạo mặc định một thư mục bên trong Application Support, nơi nó lưu trữ các cơ sở dữ liệu. Vì vậy, có lẽ tốt hơn để loại trừ một cấp lên như thế này: 'hãy DBPATH = NSPersistentStore.MR_urlForStoreName (storeFileName) .URLByDeletingLastPathComponent' – Lubbo

+0

' nếu chúng ta hãy DBPATH = NSPersistentStore.MR_urlForStoreName (storeFileName) .URLByDeletingLastPathComponent { làm { thử dbPath.setResourceValue (NSNumber (bool: true), forKey: NSURLIsExcludedFromBackupKey) } phát hiện lỗi { in (lỗi) } } ' – Lubbo

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