2013-01-24 12 views
5

Moja aplikacja ma podstawowy db danych, który jest wypełniany przy pierwszym uruchomieniu do użytku w trybie offline. Ta baza danych jest następnie synchronizowana przy każdym uruchomieniu za pomocą db online. Tylko pierwsze uruchomienie zawiera znaczną ilość danych. Aplikacja pobiera również niektóre obrazy z Internetu, które są następnie konwertowane na dane binarne i zapisywane w danych podstawowych do użytku w trybie offline. Dzieje się tak tylko wtedy, gdy użytkownik przejdzie do sekcji zawierającej niektóre obrazy i tylko te obrazy zostaną pobrane (aplikacja nie pobiera wszystkich obrazów naraz, tylko jeśli są one potrzebne).Karta danych podstawowych "nie archiwizuj"

Używam Magical Record.

Nie zapisuję żadnych danych do pliku w czasie wykonywania. Jednak moja aplikacja została odrzucona z tą wiadomością:

Okazało się, że Twoja aplikacja nie jest zgodna z wytycznymi dotyczącymi przechowywania danych w iOS, które są wymagane zgodnie z Wytycznymi oceny App Store.

Zaleca sprawdzanie "Ustawienia> iCloud> Przechowywanie & Kopia zapasowa> Zarządzaj pamięcią masową", ale moja aplikacja nawet się nie wyświetla.

Rozumiem, że powinienem oznaczać podstawowe dane, zamiast wysyłać wiadomości do iCloud, ale nie rozumiem, jak to zrobić. Podobno powinienem wdrożyć coś takiego, ale nie wiem, jak zastosować go do moich podstawowych plików danych.

- (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; } 

Odpowiedz

1

Znajdź: NSPersistentStoreCoordinator+MagicalRecord.m

Następnie znaleźć:

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

Na dole tej metody, będzie można zobaczyć:

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

zmienić na:

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

Daj mi znać, jeśli metoda wygląda inaczej dla ciebie, ale to jest to, czego używam do mojej własnej realizacji. Upewnij się tylko, że wrzuciłeś funkcję, o której wspomniałeś w swoim pytaniu.

+1

Jeśli MagicalRecord jest używany jako strąk, nie będzie to nadpisane w każdej chwili możemy wyciągnąć aktualizacji dla tej Pod? – Matt

2

Poniżej może być lepiej niż zmiana plików źródłowych MacigalRecord. w 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

To jest droga. Dla osób z Objective C: 'NSURL * dbURL = [NSPersistentStore MR_urlForStoreName: @" storename "]; NSError * error = zero; BOOL success = [dbURL setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: & error]; ' – Richard

+0

Proponuję wykluczyć cały katalog z kopii zapasowej, nie tylko .sqlite. W przeciwnym razie do kopii zapasowej zostaną dołączone pliki DB z księgowaniem. Jeśli dobrze pamiętam, MagicalRecord tworzy domyślnie katalog wewnątrz Application Support, w którym przechowuje al bazy danych. Więc chyba lepiej wykluczyć jeden poziom w górę tak: 'niech dbPath = NSPersistentStore.MR_urlForStoreName (storeFileName) .URLByDeletingLastPathComponent' – Lubbo

+0

' jeśli niech dbPath = NSPersistentStore.MR_urlForStoreName (storeFileName) .URLByDeletingLastPathComponent {{ nie próbować dbPath.setResourceValue (NSNumber (bool: true), forKey: NSURLIsExcludedFromBackupKey) } catch let error { print (błąd) } } – Lubbo

Powiązane problemy