2016-04-30 19 views
13

Mam koordynator WEW Store zadeklarowane tak:Batch żądanie usunięcia awarii aplikacji

lazy var ramStoreCoordinator: NSPersistentStoreCoordinator = { 
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. 
    // Create the coordinator and store 
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    var failureReason = "There was an error creating or loading the application's saved data." 
    do { 
     try coordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil) 
    } catch { 
     // Report any error we got. 
     var dict = [String: AnyObject]() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 

     dict[NSUnderlyingErrorKey] = error as NSError 
     let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

jak również powiązanych ManagedObjectContext:

lazy var ramManagedObjectContext: NSManagedObjectContext = { 
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. 
    let coordinator = self.ramStoreCoordinator 
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = coordinator 
    managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 
    return managedObjectContext 
}() 

Próbuję wykonać żądania pobierania jak tak :

let fetchRequest = NSFetchRequest(entityName: "Post") 
    let batchDelete = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
    do { 
     // Execute Batch Request 
     try ramManagedObjectContext.executeRequest(batchDelete) 
    } catch { 
     let updateError = error as NSError 
     print("\(updateError), \(updateError.userInfo)") 
    } 

linia:

try ramManagedObjectContext.executeRequest(batchDelete) 

zawiesza aplikację w następujący wynik:

2016-04-30 23: 47: 40.271 poufne [2368: 1047869] * zakończenie aplikacji ze względu nieprzechwyconego wyjątku 'NSInternalInconsistencyException', przyczyny: ' Nieznany typ polecenia (encja: EntityName; predicate: ((null)); sortDescriptors: ((null)); type: NSManagedObjectIDResultType;)>” * pierwsze wezwanie rzut stosu: (0x18145ae38 0x180abff80 0x1833710b0 0x18338991c 0x183391d64 0x101121a3c 0x10112d5f0 0x1833845bc 0x1832c1d5c 0x183354e04 0x10011abc4 0x10011947c 0x100092bf0 0x10009269c 0x1000926ec 0x186a1aac0 0x186a1b258 0x186901854 0x186904a4c 0x1866d4fd8 0x1865e0014 0x1865dfb10 0x1865df998 0x183f4da20 0x101121a3c 0x1011274e4 0x181410dd8 0x18140ec40 0x181338d10 0x182c20088 0x18660df70 0x1000fcba8 0x180ed68b8) libc + + abi.dylib: kończące się nieprzechwyconego wyjątkiem typu NSException

+2

Mogę zrozumieć, że nie jest to zaimplementowane dla magazynu pamięci, ponieważ cały punkt żądania nie ładuje żadnej zawartości sklepu SQLite do pamięci tylko po to, aby go usunąć ... – Wain

+0

@Wain: Więc w przypadku sklepu InMemory, partia delete byłoby równoznaczne z po prostu wywoływaniem delete na każdym obiekcie pod względem wydajności? Fakt, że Apple powinien to udokumentować stoi. – Quantaliinuxite

+0

Tak i zgadzam się – Wain

Odpowiedz

1

NSBatchDeleteRequest powinny być wykonywane na ramStoreCoordinator, nie ramManagedObjectContext, ponieważ działa bezpośrednio z NSPersistenceStore instancji klasy:

try persistentStoreCoordinator.executeFetchRequest(batchDelete, withContext: ramManagedObjectContext) 

Sprawdź ten link po więcej szczegółów: https://developer.apple.com/videos/play/wwdc2015/220/

nadzieję, że to pomogło)

+5

To daje mi dokładnie tę samą awarię – Quantaliinuxite

2

miałem dokładnie ten sam problem. Rozwiązano, zmieniając magazyn w pamięci na NSSQLiteStoreType. Nie zrobiłem żadnych badań, dlaczego tak się dzieje w pamięci, ale mam nadzieję, że rozwiąże twój problem.

0

Ten błąd może wystąpić podczas zmiany nazwy niektórych plików poza XCode. Aby go rozwiązać, możesz po prostu usunąć pliki z projektu (kliknij prawym przyciskiem myszy - Usuń i "Usuń odniesienie") Ponownie zaimportujesz pliki do projektu i wszystko będzie dobrze!

Jeśli to nie rozwiąże, spróbuj tego

try persistentStoreCoordinator.executeFetchRequest(
    batchDelete, withContext:context 
) 

jak NSBatchDeleteRequest jest wykonywany na utrzymującą koordynatora sklepie, nie zarządzanym kontekście obiektu.

5

Z mojego doświadczenia wynika, że ​​NSBatchDeleteRequest nie będzie działać z NSInMemoryStoreType. Próbowałem tego samego, aby przetestować moje metody, ale będę musiał powstrzymać się od tego.

Edit:

Dodawanie Marcus Zarra's tweet jako dowód.

+0

Warto pamiętać, że jeśli Twoim celem jest usunięcie ** wszystkich ** wystąpień ** wszystkich ** podmiotów, możesz uzyskać ten sam efekt, tworząc nowe magazyn pamięci. Nie ma pliku SQLite do czyszczenia, więc możesz po prostu wyrzucić wszelkie odniesienia do bieżącego magazynu w pamięci. –

Powiązane problemy