Korzystam z danych podstawowych, aby lokalnie utrwalać wyniki połączenia z usługami sieci Web. Usługa internetowa zwraca pełny model obiektowy dla, powiedzmy, „samochodów” - może to być około 2000 z nich (i nie mogę sprawić, aby usługa internetowa zwróciła mniej niż 1 lub WSZYSTKIE samochody.
Następnym razem, gdy otworzę moją aplikację, chcę odświeżyć utrwaloną kopię Core Data przez ponowne wywołanie usługi sieci Web dla wszystkich samochodów, jednak aby uniknąć duplikatów, najpierw muszę wyczyścić wszystkie dane z lokalnej pamięci podręcznej.
Czy istnieje szybszy sposób na wyczyszczenie WSZYSTKICH instancji określonej encji w kontekście obiektu zarządzanego (np. Wszystkich encji typu „CAR”), czy też muszę zapytać je o wywołanie, a następnie iterować wyniki, aby je usunąć, a następnie zapisać?
Idealnie byłoby po prostu powiedzieć „usuń wszystko, gdzie bytem jest Blah.
źródło
Odpowiedzi:
iOS 9 i nowsze wersje:
iOS 9 dodał nową klasę o nazwie,
NSBatchDeleteRequest
która umożliwia łatwe usuwanie obiektów pasujących do predykatu bez konieczności ładowania ich wszystkich do pamięci. Oto jak z niego skorzystasz:Szybki 5
Cel C
Więcej informacji na temat usuwania partii można znaleźć w sesji „Co nowego w podstawowych danych” z WWDC 2015 (od ~ 14: 10).
iOS 8 i wcześniejsze:
Pobierz je wszystkie i usuń je wszystkie:
źródło
Zresetuj jednostkę w Swift 3 :
źródło
Trochę bardziej oczyszczony i uniwersalny: dodaj tę metodę:
źródło
W przypadku Swift 2.0:
źródło
Szybki:
źródło
To jest podobne pytanie do tego tutaj i ktoś zasugerował skonfigurowanie reguły usuwania relacji, więc musisz usunąć tylko jeden obiekt. Więc jeśli masz lub możesz utworzyć byt mający relację wielu do samochodów i ustaw regułę kasowania kaskadowo, gdy usuniesz wyższy byt, wszystkie samochody również zostaną usunięte. Może to zaoszczędzić trochę czasu na przetwarzanie, ponieważ nie musisz wykonywać czynności związanych z ładowaniem WSZYSTKICH samochodów. W większym zestawie danych może to być absolutnie konieczne.
źródło
Dobra odpowiedź została już opublikowana, to tylko rekomendacja!
Dobrym sposobem byłoby po prostu dodanie kategorii
NSManagedObject
i wdrożenie metody takiej jak ja:Plik nagłówka (np.
NSManagedObject+Ext.h
)Plik kodu: (np. NSManagedObject + Ext.m)
... jedyne, co musisz zrobić, to pobrać manageObjectContext od delegata aplikacji lub tam, gdzie każdy go ma;)
potem możesz go używać w następujący sposób:
jedną dalszą optymalizacją może być usunięcie parametru dla nazwy encji i zamiast tego pobranie nazwy z nazwy clazzname. doprowadziłoby to do użycia:
bardziej czysty impl (jako kategoria do NSManagedObjectContext):
Zastosowanie wtedy:
źródło
[AppDelegate managedObjectContext]
niekoniecznie jest to „czysta architektura” .. ;-)deleteAllFromEntity: inManagedObjectContext:
Aktualizacja Swift 4, iOS 12 i Xcode 10
W 100% działa tylko wyciąć i wkleić
Wystarczy umieścić tę funkcję w odpowiedniej klasie i wywołać tę funkcję
self.deleteData()
wviewDidLoad()
dowolnym miejscu lub pod funkcją lub przyciskiem, aby po kliknięciu przycisku wszystkie dane z encji mogły zostać usunięte i zastąpić „myEntity” jako encję zdefiniowaną w podstawowe daneźródło
Swift 3.X i Swift 4.X , Łatwy sposób. Zmień tylko YourTable
źródło
iOS 10 i nowszy
Działa ze wszystkimi wersjami. Przekaż nazwę encji i iteruj, aby usunąć wszystkie wpisy i zapisać kontekst.
źródło
CoreDataStack()
lubDataController()
zajęcia są. Aktualizacja byłaby mile widziana;)Rozszerzając odpowiedź Dave'a Delonga.
Szybka wersja, która dba również o iOS 9 i poprzednie wersje. Omówiłem także obsługę błędów w tym:
let appDelegate: AppDelegate = UIApplication.sharedApplication (). deleguj jako! AppDelegate
źródło
Dlaczego nie złożyć danych, które otrzymujesz z istniejącą pamięcią podręczną? W przeciwnym razie nie jest to tak naprawdę „odświeżanie”, ale „zaczyna się od nowa” i równie dobrze możesz upuścić / usunąć plik SQLLite i zacząć od nowa (zakładając, że nie utrwalasz również innych danych).
źródło
Swift 4, iOS 10+
Funkcja statyczna, którą można zastosować do dowolnego podmiotu w celu usunięcia wszystkich jego danych
„Pokój” jest bytem
Edytowane w 20191025: instrukcja „Self.fetchRequest ()” może powodować problemy, jeśli używamy wielu celów w tych samych projektach. Tak zastąpiony przez NSFetchRequest (entityName: String (opisujący: self))
źródło
jeśli jednostka zawiera wiele wpisów, najlepszym sposobem jest to, ponieważ oszczędza pamięć
źródło
W Swift 3.0
źródło
Ten kod będzie działał na iOS 9 i niższych
źródło
iOS 9.0 i nowsze:
NSBatchDeleteRequest
służy do usuwania rekordów w podstawowych danych. Działa bardzo szybko i usuwanie wszystkich rekordów z encji zajmuje mniej czasu. To wymagaNSFetchRequest
kłótni. Jeśli chcesz usunąć wszystkie rekordy z encji, możesz z nich skorzystać i to działa dla mnie.źródło
szybkie czyszczenie wszystkich obiektów w DB:
źródło
Odpowiedź Swift 2.0 autorstwa Dave'a Delongsa była dla mnie awarią (w iOS 9)
Ale to zadziałało:
źródło
Rozwiązanie Swift 3 z iOS 9 „NSBatchDeleteRequest” i powrót do wcześniejszych wersji iOS zaimplementowanych jako rozszerzenie „NSManagedObjectContext”. Referencje Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
źródło
Użyj NSBatchDeleteRequest, aby usunąć wiele rekordów, jeśli minimum iOS to 9.0. Jeśli wątek w tle, wykonaj NSManagedObjectContext zapisz, użyj NSFetchRequest, aby pobrać rekordy i usunąć wszystkie rekordy w pętli for i zapisz po usunięciu.
źródło
w iOS 11.3 i Swift 4.1
musisz wykonać reset po zakończeniu. Jeśli nie, nie zostanie zaktualizowany w widoku tabeli.
źródło
źródło
sposób OOP bez żadnych ciągów nazw podmiotów Swift 3+, Xcode 10+
następnie wystarczy wywołać blok do / catch
źródło
W Swift 2.0:
źródło