2011-06-29 5 views
23

Tôi đang sử dụng dữ liệu cốt lõi trong ứng dụng của mình và tôi đang bối rối khi xóa một số hàng hoặc mục nhất định khỏi bộ nhớ dữ liệu chính. Tôi chèn một số sản phẩm vào bộ nhớ như vậy:Xóa mục nhập/hàng cụ thể khỏi Core-Data

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

Điều này có tác dụng tốt khi chèn. Tuy nhiên, sau này trong ứng dụng, tôi muốn loại bỏ các mục nhập, ví dụ, pid là 53. Làm thế nào tôi sẽ đi về loại bỏ chỉ hàng/nhập cảnh này? SQL tương đương sẽ giống như sau:

DELETE from Product WHERE pid = '53' 

Tôi sẽ đánh giá rất cao một số mã ví dụ, vì tôi không thể hình dung điều này.

Cảm ơn bạn đã được trợ giúp.

Trả lời

6

Hãy nhớ nghĩ về Dữ liệu cốt lõi làm biểu đồ chứ không phải DB, do đó khái niệm về các hàng không áp dụng. Thay vào đó, bạn muốn xóa một đối tượng cụ thể khỏi biểu đồ.

Bạn đã sử dụng insertNewObjectForEntityForName:inManagedObjectContext: để chèn. Sử dụng deleteObject: để xóa nó, chẳng hạn như:

[aContext deleteObject:aManagedObject];

Trong trường hợp của bạn,

[context deleteObject:Product];

Chúc may mắn

Xem của Apple explanation here

Lưu ý: khi bạn xóa, tùy thuộc vào kế hoạch của bạn, có thể có ý nghĩa khác nhau S. Ví dụ, nó có thể xóa mọi thứ xa hơn con đường con của đồ thị đối tượng Dữ liệu cốt lõi của bạn. Hãy chắc chắn rằng bạn nghĩ rằng khó khăn khi thiết kế lược đồ của bạn về cách làm việc đó. Nếu bạn thiết lập nó đúng, điều này có thể là một lợi thế rất lớn cho bạn.

+0

kiến ​​thức tuyệt vời mà bạn đã chia sẻ .. –

42

Như @Nektarios đã nói, bạn đang xử lý các đối tượng ở đây để bạn muốn tìm một đối tượng có giá trị thuộc tính cụ thể. Bạn với một yêu cầu tìm nạp và một vị từ.

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 

Mảng fetchedProducts sẽ chứa tất cả các đối tượng của thực thể Productpid thuộc tính bằng soughtPid. Lưu ý rằng biến vị ngữ hoàn thành cùng một hàm logic như mệnh đề where trong SQL.

Một khi bạn có các đối tượng mà bạn vừa nói với ngữ cảnh để xóa chúng:

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

Khi bạn tới tiết kiệm bối cảnh, dữ liệu của đối tượng sẽ bị xóa khỏi các tập tin lưu trữ dai dẳng.

+0

tôi chỉnh sửa một số mã theo yêu cầu của tôi, nhưng mã này làm việc cho tôi nhờ @TechZen – MahboobiOSDeveloper

+0

công việc xuất sắc u đã làm .. nó hoạt động tốt –

+0

Bạn có thể viết mã nhanh không? – amish

2

sử dụng này

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

Sử dụng phương pháp này:

+ (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

Khá đơn giản nơi DatabaseInfo là tên của thực thể của tôi, nơi tên tập tin là một thuộc tính

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) 
{ 
    _label1.tex[email protected]"No Match Found"; 
} 
else{ 
    matches = objects[0]; 

    [context deleteObject:matches]  

} 
11

Giống như Sqlite của " DELETE từ tableName WHERE condition ", bạn không có bước nào để xóa MULTIPLE đối tượng khỏi CoreD ata.

Trong CoreData, trước tiên bạn phải lấy đối tượng mà đã bị xóa, sử dụng NSFetchRequestNSPredicate

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]; 

Sau đó, bạn nên lặp qua mọi NSManagedObject và gọi deleteObject: từ NSManagedObjectContext của bạn .

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

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

Vâng, điều này hoạt động hoàn hảo. – ravinder521986

1

Tôi đã làm việc với thao tác vuốt UITableView để xóa trong vài ngày, cuối cùng tôi đã hoàn thành công việc.

Chế độ xem bảng được điền bởi dữ liệu từ đối tượng dữ liệu lõi. Phương thức ủy quyền đã được sử dụng là:

-(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]; 
} 

Hy vọng giúp đỡ ai đó.

0

Trong 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

Mã này không xóa hàng, nhưng thay vào đó làm cho 'currentItemId' = 0. Tôi đang tìm kiếm để xóa hàng thay thế. – amish