2013-02-26 11 views
7

Poniższy kod nie usuwa encji. Komunikat "Usunięcie powiodło się" pojawia się na konsoli, aby znaleźć obiekt. Wszystkie inne operacje, których używam, są skuteczne.Nie można usunąć jednostki z danych podstawowych za pomocą narzędzia RestKit 0.20

Używam pakietu RestKit 0.20.

NSManagedObjectContext *context = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
NSError *error = nil; 

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity: [NSEntityDescription entityForName:@"Auction" inManagedObjectContext:context]]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"AuctionID = %d", auctionID]; 
[fetchRequest setPredicate:predicate]; 

NSArray *result = [context executeFetchRequest:fetchRequest error:&error]; 
if(result.count) { 
    Auction *block = result[0]; 
    [context deleteObject:block]; 
    BOOL status = [context save:&error]; 
    if (status == NO) { 
     NSLog(@"delete falied for AuctionID:%d, error: %@", auctionID, error); 
    } 
    else { 
     [context processPendingChanges]; 
     NSLog(@"delete was successful for AuctionID:%d", auctionID); 

    } 
} 

Dlaczego ta operacja usunięcia nie powiodła się i jakie jest rozwiązanie, aby jej działanie działało.

+0

Gdzie widzisz instancję po jej usunięciu? –

+0

Używam narzędzia innej firmy "Base" na pliku * .sqlite w symulatorze. Mogę usunąć elementy za pomocą tego narzędzia. – zaph

+0

Właściwie to zastanawiałem się, jaki jest symptom problemu i kiedy go widzę. Powiedziałeś, że masz problem z usuwaniem danych, kiedy widzisz elementy, które Twoim zdaniem zostały usunięte? –

Odpowiedz

5

Znalazłem rozwiązanie:

W rzeczywistości, trzeba pobrać dane teleadresowe z persistentstore a nie aktualny utworzony zarządzanego kontekstu:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyModel"]; 
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:NO]; 
fetchRequest.sortDescriptors = @[descriptor]; 

// Setup fetched results 
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                     managedObjectContext:[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 

// AND TO DELETE A MODEL : 

[[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:myobject]; 
+0

Dziękuję :) Jeśli znajdziesz lepsze rozwiązanie, nie wahaj się go zastosować. – Sebastien

+0

To rozwiązuje problem. Problemem był kontekst: "[RKManagedObjectStore defaultStore] .persistentStoreManagedObjectContext" było dokładną poprawką. – zaph

2

Robię to samo i mam prawie ten sam kod. W moim kodzie również otrzymuję kasowanie zrobione i zapisane ....

Ale nie jest ono usuwane, gdy sprawdzam DB.

problem nie dotyczy symulatora ... BĘDĘ dostaję ten sam problem na urządzeniu. jest coś zwanego kontekstem podrzędnym, może być przyczyną ... Sprawdź te linki: http://restkit.org/api/0.20.0-dev/Classes/RKManagedObjectRequestOperation.html#//api/name/managedObjectContext RestKit 0.20 — What is the preferred way to create a new NSManagedObject? . Jeśli znalazłeś rozwiązanie pls tutaj podzielić

+0

Ten sam błąd, jakiś pomysł? – Sebastien

+0

Upewnij się, że sprawdzasz bazę danych po zatrzymaniu aplikacji. Ponieważ zmiany nie są odzwierciedlane, chyba że są ze sobą powiązane. A więc Usuń -> odłącz i sprawdź. W moim przypadku nadal nie został usunięty po sprawdzeniu go w ten sposób. I tak, teraz jestem w stanie usunąć go jawnie, ale to źle, powinien być usunięty tylko przez restkit. Jeśli któreś z was dostanie rozwiązanie, proszę pisać tutaj – Sumitiscreative

2

@Sumitiscreative Pobiegłem w ten sam problem dzisiaj. Co się stanie, jeśli odkryjesz, że zwykle używasz Core Data, musisz użyć tej opcji, aby zapisać zmiany. I wykopane przez Restkit trochę i znalazłem ten

[[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:(NSManagedObject *)]; 
[[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext saveToPersistantStore:(NSError *)]; 

Wywołanie tej po powyższa metoda usuwania pracuje, aby usunąć obiekt z DB.

** Edit - też bym właśnie zrobił ten komentarz, ale nie mam opcji

1

@Lance Hej, pls zaktualizować restkit z najnowszą wersją. Jak teraz działa to w najnowszej wersji, jeśli konfiguracja związana z serwerem jest poprawna. i jeśli otrzymasz kody sukcesu dla żądania usunięcia z serwera. Następnie, restkit automatycznie usuwa dane.

Jeśli chcesz usunąć dowolne dane z zewnątrz, możesz użyć parametru persistentStoreManagedObjectContext i po usunięciu zapisać go.

Ponadto, jeśli chcesz sprawdzić na końcu, czy jest to prawidłowe usuwanie za pomocą pakietu, czy nie. co możesz zrobić, to ...

złożyć wniosek o usunięcie, po sukcesie sprawdzić z tym samym identyfikatorem, jeśli pozycja istnieje. (tylko po pomoc)

Powiązane problemy