Czy znasz sposób na usunięcie wszystkich wpisów przechowywanych w podstawowych danych? Mój schemat powinien pozostać taki sam; Chcę tylko zresetować go do stanu pustego.
Edytować
Chcę to zrobić programowo, aby użytkownik mógł w zasadzie nacisnąć reset
przycisk.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
źródło
źródło
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Odpowiedzi:
Nadal możesz usunąć plik programowo, używając metody NSFileManager: removeItemAtPath ::
Następnie po prostu dodaj z powrotem trwały sklep, aby upewnić się, że jest on poprawnie odtwarzany.
Programowy sposób iteracji przez każdą jednostkę jest zarówno wolniejszy, jak i podatny na błędy. Wykorzystanie tego w ten sposób ma miejsce, jeśli chcesz usunąć niektóre podmioty, a nie inne. Jednak nadal musisz upewnić się, że zachowałeś integralność referencyjną, w przeciwnym razie nie będziesz w stanie utrzymać swoich zmian.
Samo usunięcie sklepu i jego ponowne utworzenie jest szybkie i bezpieczne, a na pewno można to zrobić programowo w czasie wykonywania.
Aktualizacja dla iOS5 +
Wraz z wprowadzeniem zewnętrznej pamięci binarnej (pozwalaExternalBinaryDataStorage lub Zapisz w zewnętrznym pliku rekordu) w iOS 5 i OS X 10.7, samo usunięcie plików wskazanych przez storeURLs nie wystarczy. Zostawisz zewnętrzne pliki nagrań. Ponieważ schemat nazewnictwa tych zewnętrznych plików rekordów nie jest publiczny, nie mam jeszcze uniwersalnego rozwiązania. - 0 maja 8 '12 o 23:00
źródło
Możesz usunąć plik SQLite - ale ja wybieram to, usuwając tabele indywidualnie za pomocą funkcji:
Powodem, dla którego zdecydowałem się zrobić to tabela po tabeli, jest to, że w trakcie programowania potwierdzam, że usunięcie zawartości tabeli jest sensowne i nie ma danych, które wolałbym przechowywać.
Zrobienie tego będzie znacznie wolniejsze niż samo usunięcie pliku, a ja zmienię na usunięcie pliku, jeśli ta metoda potrwa zbyt długo.
źródło
Zaktualizowane rozwiązanie dla iOS 10+
Służy
NSBatchDeleteRequest
do usuwania wszystkich obiektów w encji bez konieczności ładowania ich do pamięci lub iteracji przez nie.Ten kod został zaktualizowany dla iOS 10 i Swift 3. Jeśli potrzebujesz obsługiwać iOS 9, zobacz to pytanie .
Źródła:
źródło
moc.performBlockAndWait({ () -> Void in
...})
.Napisałem
clearStores
metodę, która przechodzi przez każdy sklep i usuwam ją zarówno z koordynatora, jak i systemu plików (pomijając błędy po bokach):Ta metoda znajduje się w
coreDataHelper
klasie, która zajmuje się (między innymi) tworzeniem trwałego magazynu, gdy jest on zerowy.źródło
Usuwam wszystkie dane z podstawowych danych na przycisku Zdarzenie w klasie HomeViewController: Ten artykuł pomógł mi tak bardzo, że pomyślałem, że wrócę.
Zauważ, że aby wywołać self.persistentStoreCoordinator, zadeklarowałem właściwość w kontrolerze Home View. (Nie martw się o manageObjectContext, którego używam do zapisywania i ładowania).
Następnie w AppDelegate ApplicationDidFinishLaunching tuż poniżej, tworząc HomeViewController, mam:
źródło
MagicalRecord sprawia, że jest to bardzo łatwe.
źródło
MR_truncateAll
je?iOS9 +, Swift 2
Usuń wszystkie obiekty we wszystkich obiektach
źródło
[Późna odpowiedź w odpowiedzi na nagrodę z prośbą o nowe odpowiedzi]
Przeglądając wcześniejsze odpowiedzi,
Ale istnieje inne, podobne podejście do usuwania trwałego sklepu, który działa. Kluczem jest umieszczenie pliku trwałego sklepu we własnym podkatalogu, który nie zawiera niczego innego. Nie umieszczaj go tylko w katalogu dokumentów (lub gdziekolwiek), utwórz nowy podkatalog tylko dla trwałego sklepu. Zawartość tego katalogu zakończy się trwałym plikiem magazynu, plikami dziennika i zewnętrznymi plikami binarnymi. Jeśli chcesz zniszczyć cały magazyn danych, usuń ten katalog, a wszystkie znikną.
Zrobisz coś takiego podczas konfigurowania trwałego sklepu:
Gdy chcesz usunąć sklep,
To rekurencyjnie usuwa zarówno niestandardowy podkatalog, jak i wszystkie zawarte w nim pliki danych podstawowych.
Działa to tylko wtedy, gdy nie masz jeszcze trwałego sklepu w tym samym folderze, co inne ważne dane . Podobnie jak katalog dokumentów, który prawdopodobnie zawiera inne przydatne rzeczy. W takiej sytuacji możesz uzyskać ten sam efekt, szukając plików, które chcesz zachować, i usuwając wszystko inne. Coś jak:
Takie podejście może być podatne na błędy . Musisz być absolutnie pewien, że znasz każdy plik, który chcesz zachować, ponieważ w przeciwnym razie możesz usunąć ważne dane. Z drugiej strony możesz usunąć zewnętrzne pliki binarne, nie znając nazwy pliku / katalogu użytego do ich przechowywania.
źródło
Oto połączone rozwiązanie do usuwania podstawowych danych.
źródło
Jeśli chcesz usunąć wszystkie obiekty i nie chcesz usuwać plików kopii zapasowej, możesz użyć następujących metod:
Uwaga: może być bardzo powolny (zależy od liczby obiektów na wykresie obiektów).
źródło
Jeśli chcesz przejść, usuń trasę wszystkich obiektów (co jest znacznie prostsze niż zbieranie stosu danych podstawowych, ale mniej wydajne), to jest lepsza implementacja:
Ta implementacja wykorzystuje się
NSOperation
do usunięcia głównego wątku i powiadomienia o zakończeniu. Możesz wysłać powiadomienie lub coś w obrębie bloku zakończenia, aby przywrócić status do głównego wątku.źródło
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
w celu użycia tej metody, inaczej pojawi się błąd:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Rozwiązanie iOS 10 + Swift 3:
Iteruje przez wszystkie podstawowe jednostki danych i usuwa je
źródło
Dzięki za post. Poszedłem za tym i zadziałało to dla mnie. Ale miałem inny problem, który nie został wymieniony w żadnej z odpowiedzi. Nie jestem więc pewien, czy to tylko ja.
W każdym razie myślałem, że opublikuję tutaj problem i sposób, w jaki go rozwiązałem.
Miałem kilka rekordów w bazie danych, chciałem wyczyścić wszystko przed zapisaniem nowych danych do bazy danych, więc zrobiłem wszystko, w tym
a następnie używane
managedObjectContext
do uzyskiwania dostępu do bazy danych (która powinna być teraz pusta), w jakiś sposób dane nadal tam były. Po pewnym czasie rozwiązywania problemu, znalazłem, że muszę zresetowaćmanagedObjectContext
,managedObject
,managedObjectModel
ipersistentStoreCoordinator
, zanim mogę użyćmanagedObjectContext
aby uzyskać dostęp do dabase. Teraz mam czystą bazę danych do pisania.źródło
Oto nieco uproszczona wersja z mniejszą liczbą wywołań funkcji AppDelegate i ostatnim fragmentem kodu, który został pominięty w najlepiej ocenianej odpowiedzi. Pojawił się również błąd „Stały obiekt nie jest osiągalny z koordynatora tego NSManagedObjectContext”, więc po prostu musiałem go dodać.
źródło
szybkie rozwiązanie:
źródło
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Jako szybkie odniesienie do zapisywania wyszukiwania w innym miejscu - odtworzenie trwałego sklepu po usunięciu można wykonać za pomocą:
źródło
Kilka dobrych odpowiedzi na to pytanie. Oto miło zwięzłe. Pierwsze dwa wiersze usuwają bazę danych sqlite. Następnie pętla for: usuwa wszystkie obiekty z pamięci manageObjectContext.
źródło
możesz także znaleźć wszystkie nazwy jednostek i usunąć je według nazwy. Jest to dłuższa wersja, ale działa dobrze, dzięki czemu nie musisz pracować ze sklepem z trwałością
w przypadku „Any_Entity_Name” wystarczy podać dowolną nazwę swojej jednostki, musimy tylko dowiedzieć się, jaki jest jej opis. ValueForKey @ „name” zwróci wszystkie nazwy encji. Wreszcie, nie zapomnij zapisać.
źródło
Przyjęta odpowiedź jest poprawna, a usunięcie adresu URL przez NSFileManager jest prawidłowe, ale jak stwierdzono w edycji iOS 5+, trwały sklep nie jest reprezentowany tylko przez jeden plik. W przypadku sklepu SQLite jest to * .sqlite, * .sqlite-shm i * .sqlite-wal ... na szczęście od iOS 7+ możemy użyć metody
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: opcje: błąd:]
aby zająć się usunięciem, więc kod powinien wyglądać mniej więcej tak:
źródło
Oto wersja, która usuwa każdy rekord w każdej tabeli, którą masz.
Szybki 4
źródło
Swift 4/5, iOS 9+
Przebudowa całego
CoreData
pliku SQLite sprawi, że wszystkie dane zostaną usunięte, dlatego wszystkie jednostki zostaną usunięte. Po prostu zadzwońdeleteAndRebuild()
.źródło
Działa ze wszystkimi wersjami. Przekaż nazwę encji i iteruj, aby usunąć wszystkie wpisy i zapisać kontekst.
źródło
Inną metodą (oprócz żądania usunięcia partii), której często używam (w zależności od wymagań aplikacji), jest zresetowanie trwałego sklepu. Implementacja wygląda następująco dla iOS 10+ i Swift (zakładając, że masz klasę CoreDataManager):
Jedną z zalet tej metody jest to, że jest ona prostsza, szczególnie gdy masz wiele rekordów danych dla wielu jednostek w swoich podstawowych danych. W takim przypadku żądanie usunięcia partii będzie wymagało dużej ilości pamięci.
źródło
Rozwiązanie Swift 5.1
źródło
Usunąć plik sklepu trwałego i skonfigurować nowego koordynatora sklepu trwałego?
źródło
Usuń sqlite z plikuURLPath, a następnie buduj.
źródło
Zakładając, że używasz
MagicalRecord
i masz domyślny magazyn trwałości:Nie podoba mi się wszystkie rozwiązania, które zakładają istnienie określonych plików i / lub wymagają wprowadzenia nazw lub klas jednostek. Jest to szybki (2), bezpieczny sposób na usunięcie wszystkich danych ze wszystkich encji. Po usunięciu odtworzy również nowy stos (tak naprawdę nie jestem pewien, jak niezbędna jest ta część).
Jest godo dla sytuacji w stylu „wylogowania”, gdy chcesz usunąć wszystko, ale masz działający sklep i moc, aby uzyskać nowe dane (po zalogowaniu się użytkownika ...)
źródło
Użyj tego
źródło
Wziąłem kod Grouchala i aby go przyspieszyć, użyłem wyliczenia w trybie współbieżnym (
NSEnumerationConcurrent
), stał się on nieco szybszy w porównaniu do pętli for (w mojej aplikacji dodałem tę funkcję dla testerów, aby mogli oni wyczyścić dane i wykonać przypadki testowe zamiast usuwać i Zainstaluj aplikację)źródło
tutaj moja wersja swift3 do usuwania wszystkich rekordów. „Użytkownicy” to nazwa podmiotu
źródło