in einem aktuellen projekt verwalte ich entities Month
, die informationen über vergangene monat 'enthalten und einer von ihnen steht natürlich für den aktuellen monat.monatliche update von coredata objekten
Jeder Monat enthält ein number
Attribut, das als Kennung für das Jahr dient. Das Attribut enthält eine NSNumber of type int32
, die den Monat mit dem Format identifiziert: YYYYMM
. So hat beispielsweise Februar 2011 das Attribut number = 201102
.
In der Anwendung gibt der Benutzer Daten ein, die immer mit dem aktuellen Monat behaftet sind. Der Benutzer hat keine Möglichkeit, Monatsdaten des abgelaufenen Monats zu bearbeiten, zu löschen oder hinzuzufügen.
so hält meine coredata 1 month
für den aktuellen Monat, der aktualisiert wird, und so viele andere Objekte wie Monat sind vergangen, in denen der Benutzer Daten eingegeben hat.
Ich habe eine Funktion
-(void)archiveMonth:(NSNumber *)month;
in meiner DAO-Klasse, die ein neues month
Objekt in Coredata erstellt oder aktualisiert den aktuellen Monat, wenn der übergebene NSNumber den aktuellen Monat entspricht.
hier der schwierige Teil
der Benutzer jedes Mal kommt in einem neuen Monat, um die Anwendung zum ersten Mal öffnet, muss ich die Anwendung alle passed month
zu archivieren, die noch einen entsprechenden Kern-Datenobjekt nicht haben.
, wie ich es tat bisher (zu Testzwecken) sieht wie folgt aus:
NSDate *rootDate = [NSDate dateWithTimeIntervalSinceReferenceDate:(10*365*24*60*60)];
// somewhere in 2010 so to be sure to catch all passed month
NSNumber *rootMonth = [dataHandler getMonthNumber:rootDate] ;
NSNumber *iterator; // acts as the monthnumber currently active in the loop
int now = [dataHandler getMonthNumber:[NSDate date]].intValue;
iterator = [NSNumber numberWithInt:rootMonth.intValue];
while (now >= iterator.intValue) {
iterator = [NSNumber numberWithInt:iterator.intValue+1];
if (iterator.intValue%100 > 12) { //jump all invalid month numbers
while (iterator.intValue%100 != 1) {
iterator = [NSNumber numberWithInt:iterator.intValue+1 ];
}
}
NSArray *temp = [dataHandler fetchMonth:iterator];
if (temp.count == 0) {
// no data = needs archive
[dataHandler archiveMonth:iterator];
}
}
ich habe dies in meiner Fabrik, die bei Start der Anwendung aufgerufen wird.
Fragendiese sehr hässlich ist und schafft eine Menge Aufwand
- wie kann ich, wenn es das erste Mal im Monat bestimmen der Benutzer die App öffnet, so dass ich jede einzelne nicht archiviert werden müssen Zeit beginnt er die App?
- sieht jemand von Ihnen eine bessere Möglichkeit, durch bestandenen Monat zu iterieren?
- könnte es sogar einen Weg geben, den ich nicht jeden Monat holen muss, um festzustellen, ob es bereits existiert?
- kann ich irgendwie herausfinden, was der letzte Monat archiviert wurde, und die Iteration von dort starten?
ich würde wirklich etwas Hilfe, Dank im Voraus zu schätzen wissen =) wenn Sie mehr Code benötigen, oder etwas finden, könnte in der Frage fehlt, schlecht glücklich sein, es zu schaffen.
note dies ein Mock-up-Code ist, dass ich für den Test verwendet wird, ist die Frage nicht, wie Sie den Code zu verbessern, aber wie der Algorithmus zu verbessern =)
A zu ändern Eine ziemlich einfache Änderung wäre, mit dem aktuellen Monat zu beginnen und rückwärts zu gehen, bis Sie einen Monat ohne Daten erreichen. – lnafziger
Ich hatte diese vorherige - aber, es ist möglich, dass es tatsächlich war ein Monat ohne Daten =), so würde es abbrechen. es ist möglich mit der Anwendung zu lassen, sagen wir haben Daten für Jan März, aber keine im April und Mai =) die wichtigere Frage ist, wie Sie den Anruf auf 1 Mal pro Monat =) –
Okay, nun die Wette, um es zu tun wäre, das Datum, das Sie zuletzt in NSUserDefaults eingecheckt haben, zu speichern und das bei jedem Start zu vergleichen, aber ich habe keine Zeit, den Code jetzt zu schreiben, sorry! – lnafziger