2017-06-06 3 views
0

Ich arbeite an einem Projekt in Swift 3.0, wo ich ein Kerndatenmodul mit einer Entität namens "PlayListDetails" habe. Dies beinhaltet zwei Unterelemente namens playlistName und trackID. Jeder Playlist-Name hat also eine TrackID-Interline. Meine Anforderung besteht darin, ein bestimmtes Tupel zu löschen, wenn der Parameter indexPath.row übergeben wurde. Obwohl ich eine Methode implementiert habe, nachdem ich die Methode ausgeführt habe, gibt es eine Ausnahme: "fataler Fehler: Index außerhalb des gültigen Bereichs". Meine Methoden sind wie unten, wo ich Daten und die Methode zum Löschen von Daten speichern.Löschen eines Datensatzes aus einer Entität in Kerndaten

speichern

public static func savePlaylistDetails(audio:[(title:String,healerName:String,trackUrl:String, trackID:String, imageUrl: String)] = [], playListName: String) { 

     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let context = appDelegate.persistentContainer.viewContext 
     let newPlaylist = NSEntityDescription.insertNewObject(forEntityName: PlayList_DETAILS_ENTITY, into: context) 

     let track = audio.map{$0.trackID} 
     print("Track",track) 

     let trackId = track[0] 

     print("ID is :",trackId) 
     newPlaylist.setValue(playListName, forKey:"playlistName") 
     newPlaylist.setValue(trackId, forKey:"trackID") 

     do{ 
      try context.save(); 
      print("Saved.....") 
     } 
     catch{ 
      print("There was an error") 
     } 
    } 

Löschen // das ist, wo ich die Ausnahme zu bekommen, und ich übergeben Sie die ausgewählten rowIndex an die Funktion

func deleteCoreData(rowIndex: Int) { 
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    var playList = [PlayListDetails]() 
    managedContext.delete(playList[rowIndex]) // this is where the exception throws 


    do { 
     try managedContext.save() 

    }catch{ 
     print("fail") 
    } 

} 

Was bin ich ??

Antwort

1

Wenn Sie versuchen, Element mit bestimmten Index zu löschen, habe ich eine Lösung zum Löschen von Element am Index zur Verfügung gestellt (dies könnte Array außer Bound-Ausnahme verursachen), aber ich empfehle Prädikat, sagen wir, dass ID, Name sein kann eines Artikels, den Sie löschen möchten.

Ich biete Lösung mit Wahrnehmung aus Ihrer Frage, Sie können Prozess des Abrufens von Entität aus DB und löschen Sie das bestimmte Element, das Sie entfernen möchten. Aktualisieren

Bitte verwalten folgenden Code hinzuzufügen, Sie nicht Prädikat verwenden vergessen, wenn Sie

func deleteCoreData(rowIndex: Int) { 

    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    do{ 
     //1. Create Request 
     let request: NSFetchRequest<PlayListDetails> = PlayListDetails.fetchRequest() 

     //Predicate is optional as per need 
     //let predicate = NSPredicate(format: "playlistId = %@", id) 
     //request.predicate = predicate 

     //2. Result object 
     let results = try managedObjectcontext.fetch(request as! NSFetchRequest<NSFetchRequestResult>) 

     guard results.count > 0 else { 
      print("No tems available handle error") 
      return 
     } 

     for i in 0...results.count-1 { 

      if i == rowIndex { 
       let theItem = results[index] as NSManagedObject 
       managedObjectcontext.delete(item) 
      } 
     } 
     /* 
     for item in results as! [NSManagedObject]{ 
      print(item) 
      //hit delete for item you want 
      managedObjectcontext.delete(item) 
     } */ 

     do { 
      try managedObjectcontext.save() // <- remember to put this :) 

     } catch { 
      // Do something... fatalerror 
      print("handle error") 
      return 
     } 

    } catch{ 
     print(error) 
     print("handle error") 
     return 

    } 
    print("handle error") 

} 

einige bestimmtes Element löschen möchten „Dies ist die Abfrage i will execute sir .. Lösche alles von PlayListDetails, wobei trackId = 123 und playlistName = demo Wie würde ich das im obigen Code erreichen "

Prädikat Mit

//use predicate for single predicate and compound for multiple predicate 
//Predicate is optional as per need 
let predicate = NSPredicate(format: "trackId = %@", id) 
let predicate2 = NSPredicate(format: "name = %@", "some name") 

//let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate, predicate2]) 

    request.predicate = predicate 

auf Lösch Abschnitt verwenden

for item in results as! [NSManagedObject]{ 
       print(item) 
       //hit delete for item you want 
       managedObjectcontext.delete(item) 
      } 
+0

Dies alles löschte ich – danu

+0

hatte Sie Prädikat zu machen, wie ich oben zur Verfügung gestellt haben (kommentiert), mit dem Prädikat Sie haben Bedingungen angeben, für welche Elemente Sie löschen möchten! – dip

+0

ein Beispiel-Code-Schnipsel würde viel zu schätzen – danu

Verwandte Themen