2016-06-28 2 views
2

Ich mache eine einfache Anwendung, wo Benutzer Gewohnheiten hinzufügen und Thema mit Swift und Realm abschließen kann für DatenbankLöschen eines Objekts nach dem Bearbeiten einer Eigenschaft in Realm RLMException Grund: 'Index 0 ist außerhalb der Grenzen (muss kleiner als 0 sein)'

Alles funktioniert gut, außer, wenn ich den Zustand bearbeiten und löschen Sie das Objekt stürzt die Anwendung mit RLMException Grund: ‚Index 0 außerhalb der Grenzen (muss kleiner als 0)‘

ich bemerkte, dass Dies geschieht nur, wenn das Element die einzige Zelle in der Tabelle ist.

Ich würde mich freuen, wenn anyo ne könnte helfen mir dabei, wie ich habe mit ihm für den ganzen Tag zu kämpfen

The Habit Objekt ist:

class Habit: Object { 

dynamic var id = 0 
dynamic var name = "" 
dynamic var state = "" 

convenience init(name: String) { 
    self.init() 
    self.id = self.incrementaID() 
    self.name = name 
    self.state = "in Progress" 
} 

override class func primaryKey() -> String? { 
    return "id" 
} 

private func incrementaID() -> Int { 
    let realm = try! Realm() 
    let value = realm.objects(Habit).map{$0.id}.maxElement() ?? 0 
    return value + 1 
}} 

Ich verwende RealmSwift, SwiftFetchedResultsController, um automatisch eine Tableview zu aktualisieren, schnelle 2 und 7 Xcode

Hier ist der Tableviewcontroller einen entsprechenden Code in MyHabitsViewController

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Get the default Realm 
    realm = try! Realm() 

    let predicate = NSPredicate(value: true) 
    let fetchRequest = FetchRequest<Habit>(realm: realm, predicate: predicate) 
    let sortDescriptor = SortDescriptor(property: "name", ascending: true) 
    let sortDescriptorSection = SortDescriptor(property: "state", ascending: false) 

    fetchRequest.sortDescriptors = [sortDescriptorSection, sortDescriptor] 

    self.fetchedResultsController = FetchedResultsController<Habit>(fetchRequest: fetchRequest, sectionNameKeyPath: "state", cacheName: nil) 
    self.fetchedResultsController!.delegate = self 
    self.fetchedResultsController!.performFetch() 
} 

FetchedResultsControllerDeleg aß Methoden:

func controllerWillChangeContent<T : Object>(controller: FetchedResultsController<T>) { 
    tableView.beginUpdates() 
} 

func controllerDidChangeSection<T : Object>(controller: FetchedResultsController<T>, section: FetchResultsSectionInfo<T>, sectionIndex: UInt, changeType: NSFetchedResultsChangeType) { 

    let indexSet = NSIndexSet(index: Int(sectionIndex)) 

    switch changeType { 

    case .Insert: 
     tableView.insertSections(indexSet, withRowAnimation: .Fade) 

    case .Delete: 
     tableView.deleteSections(indexSet, withRowAnimation: .Fade) 

    case .Update: 
     tableView.reloadSections(indexSet, withRowAnimation: .Fade) 

    case .Move: 
     tableView.deleteSections(indexSet, withRowAnimation: .Fade) 
     tableView.insertSections(indexSet, withRowAnimation: .Fade) 
    } 
} 

func controllerDidChangeObject<T : Object>(controller: FetchedResultsController<T>, anObject: SafeObject<T>, indexPath: NSIndexPath?, changeType: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    switch changeType { 

    case .Insert: 
     tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade) 

    case .Delete: 
     tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 

    case .Update: 
     tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 

    case .Move: 
     tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 
     tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade) 
    } 
} 

func controllerDidChangeContent<T : Object>(controller: FetchedResultsController<T>) { 
    tableView.endUpdates() 
} 

UITableViewDelegate & UITableViewDataSource

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.fetchedResultsController!.numberOfSections() 
} 

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return fetchedResultsController!.titleForHeaderInSection(section) 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.fetchedResultsController!.numberOfRowsForSectionIndex(section) 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("HabitInfoCell", forIndexPath: indexPath) as! HabitInfoCell 

    let habit = self.fetchedResultsController!.objectAtIndexPath(indexPath)! 

    cell.configure(habit) 

    // add delete button 
    let deleteButton = MGSwipeButton() { 

     try! self.realm.write { 
      self.realm.delete(habit) 
     } 
    } 
    cell.leftButtons = [deleteButton] 

    // add complete button 
    let completeButton = MGSwipeButton() { 

     try! self.realm.write { 
      habit.state = "Completed" 
     } 
    } 
    cell.rightButtons = [completeButton] 

    return cell 
} 
+0

können Sie ein reproduzierbares Projekt teilen? –

+0

Haben Sie irgendeine Lösung gefunden? Ich stehe vor demselben Problem –

Antwort

1

Dieser Fehler wird angezeigt, wenn Sie einen Index größer als die Gesamtzahl in Realm-Objekt übergeben.

  1. Überprüfen Sie, ob Ihr Realm DB den Eintrag enthält, den Sie auf Tableview anzeigen.
  2. Download-Realm-Browser auf dem Mac: Link

ich das gleiche Problem hatte, bemerkte ich, dass der Eintrag nicht zu Realm DB gemacht wurde.

Denken, dass Realm bereits den Eintrag hat, versuchte ich zu holen. So führt

RLMException reason: 'Index 0 is out of bounds (must be less than 0)'

  1. Log Home-Verzeichnis auf der Konsole die realm.db Datei mit diesem Code zu erhalten:

    let path = NSHomeDirectory() .appending ("/ Documents /") print (Pfad)

Verwandte Themen