Usunąć/zresetować wszystkie wpisy w Core Data?
Czy znasz jakiś sposób na usunięcie wszystkich wpisów przechowywanych w Core Data? Mój schemat powinien pozostać taki sam; chcę tylko zresetować go do pustego.
Edit
Chcę to zrobić programowo, aby użytkownik mógł zasadniczo nacisnąć przycisk reset
.
29 answers
Nadal można programowo usunąć plik, używając metody NSFileManager:removeItemAtPath::.
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
Następnie po prostu dodaj trwały sklep z powrotem, aby upewnić się, że jest odtworzony prawidłowo.
Programowy sposób iteracji przez każdą jednostkę jest zarówno wolniejszy, jak i podatny na błędy. Zastosowanie do robienia tego w ten sposób jest, jeśli chcesz usunąć niektóre encje, a nie inne. Jednak nadal musisz upewnić się, że zachowasz integralność odniesienia lub nie będziesz w stanie utrzymać swojej zmiany.
Samo usunięcie sklepu i odtworzenie go 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 (pozwala na przechowywanie lub Przechowywanie w zewnętrznym pliku rekordu) w iOS 5 i OS X 10.7, samo usuwanie plików wskazywanych przez storeURLs nie wystarczy. Zostawisz zewnętrzne pliki. Ponieważ schemat nazewnictwa tych zewnętrznych plików rekordów nie jest public, nie mam jeszcze uniwersalnego rozwiązania. - an0 Maj 8 '12 at 23: 00
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-08 11:42:40
Możesz usunąć plik sqllite - ale ja wybieram to, czyszcząc tabele pojedynczo za pomocą funkcji:
- (void) deleteAllObjects: (NSString *) entityDescription {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
for (NSManagedObject *managedObject in items) {
[_managedObjectContext deleteObject:managedObject];
DLog(@"%@ object deleted",entityDescription);
}
if (![_managedObjectContext save:&error]) {
DLog(@"Error deleting %@ - error:%@",entityDescription,error);
}
}
Powodem, dla którego zdecydowałem się to zrobić tabela po tabeli, jest to, że pozwala mi to potwierdzić podczas programowania, że usuwanie zawartości tabeli jest rozsądne i nie ma danych, które wolałbym zachować.
Robienie tego będzie znacznie wolniejsze niż tylko usuwanie pliku i zmienię na plik usuń, jeśli ta metoda trwa zbyt długo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 08:12:23
Zaktualizowane rozwiązanie dla iOS 9 +
Użyj NSBatchDeleteRequest
, Aby usunąć wszystkie obiekty w encji bez konieczności ładowania ich do pamięci lub iteracji przez nie.
// create the delete request for the specified entity
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
// perform the delete
do {
try persistentContainer.viewContext.execute(deleteRequest)
} catch let error as NSError {
print(error)
}
Ten kod został zaktualizowany dla iOS 10 i Swift 3. Jeśli chcesz obsługiwać iOS 9, Zobacz to pytanie.
Źródła:
- Dane podstawowe: najszybszy sposób na usunięcie wszystkich instancji podmiotu (zawiera kod Objective-C)
- Co nowego w Core Dane (wideo WWDC 2015)
- Co nowego w Core Data (wideo WWDC 2016)
- Jak korzystać z podstawowych danych w iOS 10
- Co nowego w Core Data Swift 3.0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:19
Napisałem metodę clearStores
, która przechodzi przez każdy sklep i usuwa ją zarówno z koordynatora, jak i z systemu plików (pomijając obsługę błędów):
NSArray *stores = [persistentStoreCoordinator persistentStores];
for(NSPersistentStore *store in stores) {
[persistentStoreCoordinator removePersistentStore:store error:nil];
[[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
Ta metoda znajduje się wewnątrz klasy coreDataHelper
, która zajmuje się (między innymi) tworzeniem persistentStore, gdy jest zerowa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-10 05:30:40
Usuwam wszystkie dane z core data na zdarzeniu button w klasie HomeViewController: Ten artykuł pomógł mi tak bardzo, że pomyślałem, że się przyczynię.
-(IBAction)buttonReset:(id)sender
{
NSLog(@"buttonReset Pressed");
//Erase the persistent store from coordinator and also file manager.
NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
NSError *error = nil;
NSURL *storeURL = store.URL;
[self.persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
NSLog(@"Data Reset");
//Make new persistent store for future saves (Taken From Above Answer)
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
}
Zauważ, że aby nazwać siebie.persistentStoreCoordinator zadeklarowałem właściwość w kontrolerze widoku domowego. (Nie martw się o managedObjectContext, którego używam do zapisywania i ładowania.)
@property (nonatomic, retain) NSManagedObjectContext * managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator * persistentStoreCoordinator;
Następnie w AppDelegate ApplicationDidFinishLaunching tuż poniżej tworząc HomeViewController mam:
homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-03 21:23:01
MagicalRecord sprawia, że jest to bardzo proste.
[MyCoreDataObject MR_truncateAll];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-01 03:32:30
[późna odpowiedź w odpowiedzi na pytanie o nowsze odpowiedzi]
Patrząc na wcześniejsze odpowiedzi,
- pobieranie i usuwanie wszystkich elementów, zgodnie z sugestiami @Grouchal i innych, jest nadal skutecznym i użytecznym rozwiązaniem. Jeśli masz bardzo duże zapasy danych, może to być powolne, ale nadal działa bardzo dobrze.
- samo usunięcie magazynu danych jest, jak zauważyłeś ty i @ świstak, już nie skuteczne. Jest przestarzały nawet jeśli nie używasz zewnętrznych binarnych storage ponieważ iOS 7 używa trybu WAL dla SQLite journaling. W trybie WAL mogą istnieć (potencjalnie duże) pliki dziennika dla dowolnego trwałego magazynu danych Core Data.
Ale jest 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 w katalogu dokumentów (lub gdziekolwiek), utwórz nowy podkatalog tylko dla trwały sklep. Zawartość tego katalogu stanie 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ą.
Zrobiłbyś coś takiego przy zakładaniu sklepu:
NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
withIntermediateDirectories:NO
attributes:nil
error:nil]) {
NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
// continue with storeURL as usual...
}
Kiedy chciałeś usunąć sklep,]}
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Że rekurencyjnie usuwa zarówno podkatalog niestandardowy, jak i wszystkie podstawowe pliki danych w to.
Działa to tylko wtedy, gdy twój trwały magazyn nie znajduje się jeszcze w tym samym folderze co inne ważne dane. Jak katalog documents, który prawdopodobnie zawiera inne przydatne rzeczy. Jeśli taka jest Twoja sytuacja, możesz uzyskać ten sam efekt, szukając plików, które chcesz zachować i usuwając wszystko inne. Coś w stylu:
NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
// Look at docsDirectoryItem. If it's something you want to keep, do nothing.
// If it's something you don't recognize, remove it.
}
Takie podejście może być podatne na błędy . Musisz być absolutnie pewien, że wiesz 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 bez znajomości nazwy pliku / katalogu używanego do ich przechowywania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 21:12:06
IOS9+, Swift 2
Usuń wszystkie obiekty we wszystkich obiektach
func clearCoreDataStore() {
let entities = managedObjectModel.entities
for entity in entities {
let fetchRequest = NSFetchRequest(entityName: entity.name!)
let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.executeRequest(deleteReqest)
} catch {
print(error)
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 13:55:06
Jeśli chcesz usunąć wszystkie obiekty i nie chcesz usuwać plików kopii zapasowych, możesz użyć następujących metod:
- (void)deleteAllObjectsInContext:(NSManagedObjectContext *)context
usingModel:(NSManagedObjectModel *)model
{
NSArray *entities = model.entities;
for (NSEntityDescription *entityDescription in entities) {
[self deleteAllObjectsWithEntityName:entityDescription.name
inContext:context];
}
}
- (void)deleteAllObjectsWithEntityName:(NSString *)entityName
inContext:(NSManagedObjectContext *)context
{
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:entityName];
fetchRequest.includesPropertyValues = NO;
fetchRequest.includesSubentities = NO;
NSError *error;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
NSLog(@"Deleted %@", entityName);
}
}
Uważaj, że może być bardzo powolny (zależy od tego, ile obiektów znajduje się na wykresie obiektów).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 17:48:41
Oto połączone rozwiązanie do czyszczenia podstawowych danych.
- (void)deleteAllObjectsInCoreData
{
NSArray *allEntities = self.managedObjectModel.entities;
for (NSEntityDescription *entityDescription in allEntities)
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDescription];
fetchRequest.includesPropertyValues = NO;
fetchRequest.includesSubentities = NO;
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Error requesting items from Core Data: %@", [error localizedDescription]);
}
for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Error deleting %@ - error:%@", entityDescription, [error localizedDescription]);
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 09:06:44
Jeśli chcesz przejść trasę delete all objects (która jest znacznie prostsza niż wybieranie podstawowego stosu danych, ale mniej wydajna), to jest to lepsza implementacja:
- (void)deleteAllManagedObjectsInModel:(NSManagedObjectModel *)managedObjectModel context:(NSManagedObjectContext *)managedObjectContext
{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[managedObjectContext performBlockAndWait:^{
for (NSEntityDescription *entity in managedObjectModel) {
NSFetchRequest *fetchRequest = [NSFetchRequest new];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesSubentities:NO];
NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
for (NSManagedObject *managedObject in objects) {
[managedObjectContext deleteObject:managedObject];
}
}
[managedObjectContext save:nil];
}];
}];
[operation setCompletionBlock:^{
// Do stuff once the truncation is complete
}];
[operation start];
}
Ta implementacja wykorzystuje NSOperation
do usunięcia głównego wątku i powiadomienia o zakończeniu. Możesz wysłać powiadomienie lub coś w bloku zakończenia, aby przywrócić status do głównego wątku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 04:00:35
IOS 10 + Swift 3 Rozwiązanie:
func clearCoreDataStore() {
let delegate = UIApplication.shared.delegate as! AppDelegate
let context = delegate.persistentContainer.viewContext
for i in 0...delegate.persistentContainer.managedObjectModel.entities.count-1 {
let entity = delegate.persistentContainer.managedObjectModel.entities[i]
do {
let query = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let deleterequest = NSBatchDeleteRequest(fetchRequest: query)
try context.execute(deleterequest)
try context.save()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
abort()
}
}
}
Iteracja przez wszystkie podstawowe jednostki danych i czyszczenie ich
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-02 21:11:38
Oto nieco uproszczona wersja z mniejszą liczbą wywołań do AppDelegate self i ostatnim bitem kodu, który został pominięty z najwyżej ocenionej odpowiedzi. Otrzymywałem również błąd "trwały sklep obiektu nie jest osiągalny z koordynatora tego nsmanagedobjectcontext", więc po prostu musiałem dodać to z powrotem.
NSPersistentStoreCoordinator *storeCoordinator = [self persistentStoreCoordinator];
NSPersistentStore *store = [[storeCoordinator persistentStores] lastObject];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dataModel"];
NSError *error;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
if (storeCoordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:storeCoordinator];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 17:13:43
Szybkie rozwiązanie:
class func deleteAllManagedObjects() {
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "mom")
let mom = NSManagedObjectModel(contentsOfURL: modelURL)
for entityName in mom.entitiesByName.keys {
let fr = NSFetchRequest(entityName: entityName as String)
let a = Utility.managedObjectContext().executeFetchRequest(fr, error: nil) as [NSManagedObject]
for mo in a {
Utility.managedObjectContext().deleteObject(mo)
}
}
Utility.managedObjectContext().save(nil)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-06 08:18:30
Jako szybkie odniesienie do zapisywania wyszukiwania w innym miejscu-odtworzenie trwałego sklepu po usunięciu można zrobić za pomocą:
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-29 09:43:52
Dzięki za post. Podążałem za nim i zadziałało na mnie. Ale miałem inny problem, który nie został wymieniony w żadnej z odpowiedzi. Więc nie jestem pewien, czy to tylko ja.
W każdym razie, pomyślałem, że zamieszczę tutaj problem i mój sposób, który go rozwiązał.
Miałem kilka rekordów w bazie danych, chciałem wyczyścić wszystko przed zapisaniem nowych danych do db, więc zrobiłem wszystko, w tym
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
A następnie użyto managedObjectContext
, Aby uzyskać dostęp do bazy danych (ma być już pusta), w jakiś sposób dane wciąż tam były.
Po chwili rozwiązywania problemów stwierdziłem, że muszę zresetować managedObjectContext
, managedObject
, managedObjectModel
oraz
persistentStoreCoordinator
, zanim użyję managedObjectContext
, Aby uzyskać dostęp do dabazy. Teraz mam czystą bazę danych do pisania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 22:15:08
Kilka dobrych odpowiedzi na to pytanie. Tu jest ładny zwięzły. Pierwsze dwie linie usuwają bazę danych sqlite. Następnie pętla for: usuwa wszystkie obiekty w pamięci managedObjectContext.
NSURL *storeURL = [[(FXYAppDelegate*)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
[self.managedObjectContext deleteObject:ct];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-05 00:19:27
Możesz również znaleźć wszystkie nazwy encji i usunąć je po nazwie. Jego dłuższa wersja, ale działa dobrze, w ten sposób nie musisz pracować z persistence store
- (void)clearCoreData
{
NSError *error;
NSEntityDescription *des = [NSEntityDescription entityForName:@"Any_Entity_Name" inManagedObjectContext:_managedObjectContext];
NSManagedObjectModel *model = [des managedObjectModel];
NSArray *entityNames = [[model entities] valueForKey:@"name"];
for (NSString *entityName in entityNames){
NSFetchRequest *deleteAll = [NSFetchRequest fetchRequestWithEntityName:entityName];
NSArray *matches = [self.database.managedObjectContext executeFetchRequest:deleteAll error:&error];
}
if (matches.count > 0){
for (id obj in matches){
[_managedObjectContext deleteObject:obj];
}
[self.database.managedObjectContext save:&error];
}
}
Dla "Any_Entity_Name" wystarczy podać dowolną nazwę encji, musimy tylko ustalić opis encji, w której znajdują się Twoje encje. ValueForKey@"name" zwróci wszystkie nazwy encji. Wreszcie, nie zapomnij zapisać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-22 04:29:25
Zaakceptowana odpowiedź jest poprawna z usunięciem adresu URL przez NSFileManager jest poprawna, ale jak stwierdzono w iOS 5 + edit, trwały sklep nie jest reprezentowany tylko przez jeden plik. Dla sklepu SQLite to *.sqlite,*.sqlite-shm i *.sqlite-wal ... na szczęście od iOS 7+ możemy użyć metody
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentstoreaturl: options: error:]
Aby zadbać o usunięcie, więc kod powinien być mniej więcej taki:
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSString *storeName = ...;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL.path options:@{NSPersistentStoreUbiquitousContentNameKey: storeName} error:&error];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-21 11:12:56
Usunąć plik persistent store i skonfigurować nowy koordynator persistent store?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 05:09:26
Usuń sqlite ze ścieżki pliku, a następnie zbuduj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 11:56:15
Zakładając, że używasz MagicalRecord
i masz domyślny magazyn trwałości:
Nie lubię wszystkich rozwiązań, które zakładają istnienie pewnych plików i / lub wymagają wprowadzania nazw encji lub klas. Jest to szybki (2), bezpieczny sposób na usunięcie wszystkich danych ze wszystkich podmiotów. Po usunięciu odtworzy też świeży stos (nie jestem pewien, jak potrzebna jest ta część).
To godo dla sytuacji w stylu "Wyloguj", gdy chcesz usunąć wszystko, ale masz działający store i moc, aby uzyskać nowe dane (po zalogowaniu się użytkownika...)
extension NSManagedObject {
class func dropAllData() {
MagicalRecord.saveWithBlock({ context in
for name in NSManagedObjectModel.MR_defaultManagedObjectModel().entitiesByName.keys {
do { try self.deleteAll(name, context: context) }
catch { print("⚠️ ✏️ Error when deleting \(name): \(error)") }
}
}) { done, err in
MagicalRecord.cleanUp()
MagicalRecord.setupCoreDataStackWithStoreNamed("myStoreName")
}
}
private class func deleteAll(name: String, context ctx: NSManagedObjectContext) throws {
let all = NSFetchRequest(entityName: name)
all.includesPropertyValues = false
let allObjs = try ctx.executeFetchRequest(all)
for obj in allObjs {
obj.MR_deleteEntityInContext(ctx)
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-08 16:20:41
Użyj tego
+(NSArray *)fetchDataFromEntity:(NSString *)entityName context:(NSManagedObjectContext *)context
{
NSFetchRequest * fetchRequest =[[NSFetchRequest alloc] init];
NSEntityDescription * CategoriesEntity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[fetchRequest setEntity:CategoriesEntity];
NSError * error;
NSInteger count = [context countForFetchRequest:fetchRequest error:&error];
if (count && count>0) {
NSArray * fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects && fetchedObjects.count>0) {
return fetchedObjects;
}else
return nil;
}
else
return nil;
}
+ (void)deleteObjectsOfArray:(NSMutableArray*)ary context:(NSManagedObjectContext *)context {
for (NSManagedObject * obj in ary) {
[context deleteObject:obj];
}
NSError *saveError = nil;
[context save:&saveError];
}
+ (void)deleteEntity:(NSString *)entityName context:(NSManagedObjectContext *)context {
NSArray *listArray = [self fetchDataFromEntity:entityName context:context];
[self deleteObjectsOfArray:[NSMutableArray arrayWithArray:listArray] context:context];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 06:46:33
Wziąłem Kod Grouchala i aby go przyspieszyć użyłem wyliczenia w trybie współbieżnym (NSEnumerationConcurrent
), zrobiło się nieco szybciej w porównaniu do pętli for (w mojej aplikacji dodałem tę funkcję dla testerów, aby mogli wyczyścić dane i zrobić testcases zamiast usuwać i instalować aplikację)
- (void)resetObjects
{
[self deleteAllObjectsInEntity:@"Entity1"];
[self deleteAllObjectsInEntity:@"Entity2"];
[self deleteAllObjectsInEntity:@"Entity3"];
[self deleteAllObjectsInEntity:@"Entity4"];
}
-(void) deleteAllObjectsInEntity:(NSString*) entityName
{
MainDataContext *coreDataContext = [MainDataContext sharedInstance];
NSManagedObjectContext *currentContext = coreDataContext.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:currentContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [currentContext executeFetchRequest:fetchRequest error:&error];
[items enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSManagedObject * obj, NSUInteger idx, BOOL *stop) {
[currentContext deleteObject:obj];
}];
if (![currentContext save:&error]) {
NSLog(@"Error deleting %@ - error:%@",entityName,error);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-04 13:19:37
Tutaj moja wersja swift3 do usunięcia wszystkich rekordów. "Użytkownicy" to nazwa podmiotu
@IBAction func btnDelAll_touchupinside(_ sender: Any) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedObjectContext = appDelegate.persistentContainer.viewContext
let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
let req = NSBatchDeleteRequest(fetchRequest: fetchReq)
do {
try managedObjectContext.execute(req)
} catch {
// Error Handling
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 14:30:19
Działa ze wszystkimi wersjami. Podaj nazwę encji i powtórz, aby usunąć wszystkie wpisy i zapisać kontekst.
func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
var context = NSManagedObjectContext()
if #available(iOS 10.0, *) {
context = self.persistentContainer.viewContext
} else {
context = self.managedObjectContext
}
let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
fetchRequest.includesPropertyValues = false
do {
let results = try context.fetch(fetchRequest) as! [NSManagedObject]
for result in results {
context.delete(result)
}
try context.save()
completion(true)
} catch {
completion(false)
print("fetch error -\(error.localizedDescription)")
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 12:19:39
IOS 10 i Swift 3
Zakładając, że Twoja nazwa encji to "zdjęcie" i że tworzysz klasę CoreDataStack...
func clearData() {
do {
let context = CoreDataStack.sharedInstance.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Photo")
do {
let objects = try context.fetch(fetchRequest) as? [NSManagedObject]
_ = objects.map{$0.map{context.delete($0)}}
CoreDataStack.sharedInstance.saveContext()
} catch let error {
print("ERROR DELETING : \(error)")
}
}
}
Oto dobry samouczek, Jak korzystać z CoreData i jak korzystać z tej metody. https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f#.1tu6kt8qb
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 05:16:18
Oto wersja, która usuwa każdy rekord w każdej tabeli, którą masz.
Swift 4
static func resetDatabase() {
do {
try dataStore.persistentStoreCoordinator.managedObjectModel.entities.forEach { (entity) in
if let name = entity.name {
let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: name)
let request = NSBatchDeleteRequest(fetchRequest: fetch)
try mainContext.execute(request)
}
}
try mainContext.save()
} catch {
print("error resenting the database: \(error.localizedDescription)")
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 03:27:11
Sprawiacie, że to wydaje się skomplikowane. Możesz po prostu wysłać nsmanagedobjectcontext metodę reset
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-12 01:29:10