2016-04-10 6 views
1

Ich bin eine neue Hand zu Core Data, ich weiß nicht, wie man einige Abfrage Satz für NSPredate und einige Probleme zu treffen. Bitte helfen zu finden mein Problem und geben Sie mir einen Vorschlag, um mein Abfrageziel zu erreichen. Zum Beispiel, jetzt habe ich eine Tabelle, es hat einige Daten. (Wie das Bild zeigt) My databaseIch weiß nicht, wie ich meinen Abfrage-Satz auf Core-Daten mit NSPredicate

Die Daten in der Tabelle mit dem Monat Attribut "2015/03/01 00:00:00 ". Nun möchte ich ein Datum abfragen, welcher Monat mit 2015/03 beginnt, ich code" fetchRequest.predicate = NSPredate (Format: "Monat BEGINSWITH [cd]% @/0% @ ", Jahr, Monat)" oder "fetchRequest.predicate = NSPredate (Format:" Monat LIKE [c]% @/0% @ ", Jahr, Monat), habe ich recht? (Jahr = 2015, Monat = 03) Wenn nicht, ich hoffe wirklich, dass mir jemand helfen kann d eine andere Frage ist die ‚cd/c‘ in [] bedeutet, was ist es, Strukturen setzen Sie den Code wie folgt:?

func remove(model:MonthlySummery) -> Int { 
    let cxt = self.managedObjectContext! 
    let entity = NSEntityDescription.entityForName("MonthlySummery", inManagedObjectContext: cxt) 
    let component = NSCalendar.currentCalendar().components([.Year,.Month], fromDate: model.month!) 
    let year = component.year 
    let month = component.month 
    let fetchRequest = NSFetchRequest() 
    fetchRequest.entity = entity 
    NSLog("month == %i/0%i", year,month) 
    fetchRequest.predicate = NSPredicate(format: "month BEGINSWITH[cd] %@/0%@", year,month) 
    do{ 
     let listData = try cxt.executeFetchRequest(fetchRequest) as NSArray! 
     if listData.count > 0 { 
      let dailyRecord = listData.lastObject as! NSManagedObject 
      cxt.deleteObject(dailyRecord) 
      if cxt.hasChanges { 
       try cxt.save() 
      } 
     } 
    } catch { 
     NSLog("Remove failure!") 
     let nserror = error as NSError 
     NSLog("Error: \(nserror), \(nserror.userInfo)") 
    } 
    return 0 
} 

Antwort

1

Es ist eine schlechte Idee Daten zu analysieren, von Strings unter Berufung auf formatierte Datum.

Refaktorieren Sie Ihren Code, um korrekte Daten zu verwenden. Die Unterklasse sollte eine Eigenschaft des Typs NSDate haben. In der eigentlichen SQLite-Datenbank wird dies durch eine lange Zahl dargestellt, aber das sollte Sie nicht interessieren.

Sie dann Start- und Enddatum von bestimmten Monat berechnen und ein Prädikat wie folgt verwenden:

NSPredicate(format: "month >= %@ && month < %@", start, end) 
+0

Danke @ Mundi, ich es, jetzt, ich habe eine andere Idee, dieses Problem zu lösen, werde ich um meine Datenbank zu rekonstituieren, indem ich das Monatsattribut von NSDate zu String ändere, weil ich jedes gewünschte Format über NSDataFormatter einstellen kann. Zum Beispiel, wenn ich eine Monatszeichenkette haben möchte, kann ich dateFormat = "yyyy-mm" setzen, wenn ich eine Tageszeichenkette haben möchte Kann ich dataFormat = "yyyy-mm-dd" einstellen. Meinst du das? – Jixes

+0

Wie gesagt, dies ist eine potenziell katastrophale Idee. Sie sollten NSDate verwenden, das zur Darstellung von Daten verwendet wird. Saiten sind nicht sehr gut, diesen Job zu machen. – Mundi

+0

Hör mir zu, wenn ich NSDate verwenden, um Daten darzustellen, werde ich nicht wissen, wie Prädikat Satz.NSDate Standardformat ist "2015/04/12 00:00:00". Nun, wenn ich abfragen möchte Daten an einem Tag, ich brauche nicht "00:00:00" in "2015/04/12 00:00:00". Wenn ich Daten im Monat abfragen muss, brauche ich nicht "/ 12 00 : 00: 00 "in" 2015/04/12 00:00:00 ", brauchen Sie nur" 2015/04 ", verstehst du? Oder können Sie mir beibringen, den Abfrage-Satz zu codieren? Ich werde Ihnen sehr dankbar sein – Jixes

Verwandte Themen