2011-06-29 11 views
23

Używam danych podstawowych w mojej aplikacji i jestem zdezorientowany, jeśli chodzi o usuwanie określonych wierszy lub wpisów z podstawowego magazynu danych. Wkładam niektóre produkty do magazynu w następujący sposób:Usuwanie określonego wpisu/wiersza z Core-Data

NSManagedObject *Product = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context]; 
[Product setValue:[NSNumber numberWithFloat:id] forKey:@"pid"]; 
[Product setValue:[NSNumber numberWithFloat:quantity] forKey:@"pquantity"]; 

To działa dobrze do wstawienia. Jednak później w aplikacji chcę usunąć wpis, w którym na przykład pid ma wartość 53. W jaki sposób chciałbym usunąć tylko ten wiersz/wpis? Odpowiedni SQL będzie podobny do:

DELETE from Product WHERE pid = '53' 

Byłbym bardzo wdzięczny za przykładowy kod, ponieważ nie mogę wymyślić tego.

Dzięki za pomoc.

Odpowiedz

6

Pamiętaj, aby myśleć o danych podstawowych jako wykres, a nie o bazie danych, więc pojęcie wierszy nie ma zastosowania. Zamiast tego chcesz usunąć określony obiekt z wykresu.

Użytkownik użył insertNewObjectForEntityForName:inManagedObjectContext:, aby go wstawić. Użyj deleteObject: aby go usunąć, takie jak:

[aContext deleteObject:aManagedObject];

w przypadku,

[context deleteObject:Product];

Powodzenia

Zobacz Apple explanation here

Uwaga: po usunięciu, w zależności od twojego schematu, który może mieć różne konsekwencje s. Na przykład może usunąć wszystko w dalszej części ścieżki potomnej na wykresie obiektu Core Data. Upewnij się, że myślisz ciężko, projektując swój schemat, jak to powinno działać. Jeśli ustawisz to dobrze, może to być dla ciebie ogromną zaletą.

+0

wielka wiedza, którą mają wspólne .. –

42

Jak powiedział @Nektarios, masz do czynienia z obiektami tutaj, więc chcesz znaleźć obiekt, który ma określoną wartość atrybutu. Ty, który za pomocą żądania pobierania i predykatu.

NSNumber *soughtPid=[NSNumber numberWithInt:53]; 
    NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"Product" inManagedObjectContext:context]; 
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    [fetch setEntity:productEntity]; 
    NSPredicate *p=[NSPredicate predicateWithFormat:@"pid == %@", soughtPid]; 
    [fetch setPredicate:p]; 
    //... add sorts if you want them 
    NSError *fetchError; 
    NSArray *fetchedProducts=[self.moc executeFetchRequest:fetch error:&fetchError]; 
    // handle error 

Tablica fetchedProducts zawiera wszystkie obiekty jednostki Product którego pid atrybut równa soughtPid. Zauważ, że predykat spełnia tę samą funkcję logicznie, co klauzula where w SQL.

Gdy masz obiekty po prostu powiedzieć kontekst, aby je usunąć:

for (NSManagedObject *product in fetchedProducts) { 
    [context deleteObject:product]; 
    } 

Kiedy następny zapisać kontekstu, dane obiektu zostaną usunięte z przetrwałym pliku sklepu.

+0

edytować kodu według moich wymagań, ale ten kod działa dla mnie dzięki @TechZen – MahboobiOSDeveloper

+0

doskonała praca u zrobili .. to działa dobrze –

+0

Czy możesz napisać kod w szybkim tempie? – amish

2

użycie tego

Entity *entity = (Entity *)[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:managedObjectContext]; 
[entity setTimeStamp:[NSDate date]]; 
NSError *error; 
if ([managedObjectContext save:&error]) { 

} 
[eventArray delete:<#(id)sender#>]; 

[self.tableView reloadData]; 
5

Zastosowanie tej metody:

+ (void)Deletebeer:(NSString*)m_Beerid 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"Beers" inManagedObjectContext:context]; 
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    [fetch setEntity:productEntity]; 
    NSPredicate *p=[NSPredicate predicateWithFormat:@"m_Beerid == %@", m_Beerid]; 
    [fetch setPredicate:p]; 
    //... add sorts if you want them 
    NSError *fetchError; 
    NSError *error; 
    NSArray *fetchedProducts=[context executeFetchRequest:fetch error:&fetchError]; 
    for (NSManagedObject *product in fetchedProducts) { 
     [context deleteObject:product]; 
    } 
    [context save:&error]; 
} 
0

Całkiem proste gdzie DatabaseInfo to nazwa mojego podmiotu, gdzie nazwa_pliku jest atrybutem

CoreAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entityDesc]; 

NSPredicate *pred= [NSPredicate predicateWithFormat:@"(filename = %@)", @"Thankyou"]; 

[request setPredicate:pred]; 
NSManagedObject *matches = nil; 

NSError *error; 
NSArray *objects = [context executeFetchRequest:request error:&error]; 

if([objects count] == 0) 
{ 
    [email protected]"No Match Found"; 
} 
else{ 
    matches = objects[0]; 

    [context deleteObject:matches]  

} 
11

Jak Sqlite w " DELETE z tableName WHERE condition ", nie masz jednego kroku do usunięcia obiektów MULTIPLE od CoreD ata.

W CoreData, najpierw trzeba sprowadzić obiektów, które muszą być usunięte przy użyciu NSFetchRequest i NSPredicate

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"EntityName"]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"propertyName == %@", value]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSManagedObjectContext *managedObjectContext;//Get your ManagedObjectContext; 
NSArray *result = [managedObjectContext executeFetchRequest:request error:&error]; 

Następnie należy powtórzyć, przez każdy NSManagedObject i nazywają deleteObject: z NSManagedObjectContext .

if (!error && result.count > 0) { 
    for(NSManagedObject *managedObject in result){ 
     [managedObjectContext deleteObject:managedObject]; 
    } 

    //Save context to write to store 
    [managedObjectContext save:nil]; 
} 
+0

Tak, to działa idealnie. – ravinder521986

1

Pracuję z przesunięciem UITableView, aby usunąć na kilka dni, w końcu mam rzeczy zrobione.

Widok tabeli jest wypełniany danymi z obiektu danych podstawowych. Metody delegatów zostały użyte:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSectin:(NSInteger)section** 
{ 
    reture [_arrData count]; 
} 

-(NSInteger)numberOfSectionInTablesView:(UITableView *)tableView 
{ 
    return 1; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 
    if(cell == nil){ 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStleDefault reuseIdentifier:cellID]; 
    } 
    cell.textLable.text = [_arrData objectAtIndex:indexPath.row]; 
    return cell; 
} 

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return YES; 
} 

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action,NSIndexPath *indexPath){ 


     //**************load address ************** 
     NSError *error; 

     AppDelegate *sharedDelegate = [AppDelegate appDelegate]; 
     NSManagedObjectContext *context = [sharedDelegate managedObjectContext]; 

     NSEntityDescription *entity = [NSEntityDescription entityForName:@"data" inManagedObjectContext:context]; 

     NSFetchRequest *fetchReuqets = [[NSFetchRequest alloc] init]; 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lat == %@", [_arrLat objectAtIndex:indexPath.row]]; 
     [fetchReuqets setPredicate:predicate]; 

     NSLog(@"delete %@",[_arrLat objectAtIndex:indexPath.row]); 

     [fetchReuqets setEntity:entity]; 
     NSArray *fetchedObjects = [context executeFetchRequest:fetchReuqets error:&error]; 
     NSLog(@"number of filtered objects=%ld",fetchedObjects.count); 
     if(!error && fetchedObjects.count>0){ 
      for (NSManagedObject *addr in fetchedObjects){ 
       [context deleteObject:addr]; 
       NSLog(@"delete addr %@",addr); 
      } 
      [context save:&error]; 
     } 
     //***************core data************************** 
     [_arrData removeObjectAtIndex:indexPath.row]; 
     [tableView reloadData]; 

    }]; 
    delete.backgroundColor = [UIColor redColor]; 
    return @[delete]; 
} 

Mam nadzieję, że pomogę komuś.

0

w Swift 3:

  if let dataAppDelegatde = UIApplication.shared.delegate as? AppDelegate { 


       let mngdCntxt = dataAppDelegatde.persistentContainer.viewContext 

       let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ItemCart") 

       let predicate = NSPredicate(format: "itemId = %i", Int(currentItemID)!) 
       print(currentItemID) 

       fetchRequest.predicate = predicate 
       do{ 
        let result = try mngdCntxt.fetch(fetchRequest) 

        print(result.count) 

        if result.count > 0{ 
         for object in result { 
          print(object) 
          mngdCntxt.delete(object as! NSManagedObject) 
         } 
        } 
       }catch{ 

       } 
      } 
+0

Ten kod nie usuwa wiersza, ale zamiast niego tworzy 'currentItemId' = 0. Zamiast tego szukam, aby usunąć wiersz. – amish

Powiązane problemy