iOSRispetto alle prime versioni di iOS una delle innovazioni più importanti è stata l’introduzione di CoreData. Esso è un approccio attraverso il quale è possibile creare un sistema di archiviazione complesso di dati all’interno della propria applicazione. Gli argomenti relativi a CoreData sono estremamente complessi e non possono essere esauriti all’interno di un singolo suggerimento, anzi riguardano concetti teorici talmente profondi da meritare di ricevere una piccola pubblicazione.

Una cosa che però salta subito all’occhio è che CoreData pur usando delle strutture simil SQL non è SQL, quindi l’interrogazione di tabelle attraverso JOIN o altri metodi non può essere preso in considerazione. Bisogna seguire le regole imposte dal sistema affinchè tutto funzioni regolarmente. Se non si preferisce adattarsi a queste regole bisogna scrivere il database di sana pianta così come i sistemi di interfacciamento ad esso.

Qualcuno, fino alla versione 5.0 (esclusa) spesso aggirava l’ostacolo iniettando delle istruzioni SQL all’interno del codice. Questo, oltre che una pratica discutibile, è anche molto rischiosa in quanto potrebbe andare in conflitto con i thread di gestione del sistema stesso. Forse anche per prevenire questo (oltre che per incrementare la sicurezza in virtù dell’adozione di iCloud) dalla versione 5.0 del sistema operativo iOS i database creati con CoreData sono criptati, o comunque protetti.

Se è pur vero che CoreData non permette di usare istruzioni in SQL puro, è anche vero che per molte cose semplifica il compito non di poco.

Uno degli aspetti su cui si notano tali semplicificazioni sono le selezioni di entità in base alle date.

Difatti volendo scrivere una query che estragga tutte le entità che hanno, ad esempio, il campo dataregistrazione uguale alla data odierna è possibile scrivere un predicato come il seguente:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dataregistrazione == %@", [NSDate date]];

Il predicato di cui sopra soffre però di un piccolo difetto, difatti il formato con cui una data viene scritta all’interno del nostro archivio è quello interno di NSDate, il quale contiene non solo la componente data ma anche la componente ora. Per risolvere questa incresciosa soluzione abbiamo due possibilità:

  1. Scriviamo tutte le date con il campo ora settato a 00:00:00 e quindi la data con cui effettuiamo la ricerca deve anch’essa avere l’ora azzerata
  2. Selezioniamo tutte le date che hanno la data come quella richiesta e l’ora compresa tra l’inizio e la fine del giorno.

La seconda soluzione è preferibile, anche perchè non complica molto di più la query e permette di mantenere maggiori informazioni al momento della scrittura dei dati nell’archivio (sempre che si desideri mantenere tali informazioni).

Supponendo quindi di voler modificare il predicato di cui sopra per cercare dall’inizio alla fine del giorno avremo il seguente risultato:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(dataregistrazione >= %@ AND dataregistrazione <= %@)", [self dataInizioGiorno], [self dataFineGiorno]];

Al quale andremo ad aggiungere i due metodi seguenti:

- (NSDate *)dataInizioGiorno {
    NSDateFormatter *dtFrmt = [[NSDateFormatter alloc] init];
    [dtFrmt setDateFormat:@"dd/MM/yyyy"];
    NSString *today = [dtFrmt stringFromDate:[NSDate date]];
    [dtFrmt setDateFormat:@"dd/MM/yyyy hh:mm:ss"];
    NSString *startDay = [NSString stringWithFormat:@"%@ 00:00:00",today];
    NSLog(@"%@",startDay);
    return [dtFrmt dateFromString:startDay];
}

- (NSDate *)dataFineGiorno {
    NSDateFormatter *dtFrmt = [[NSDateFormatter alloc] init];
    [dtFrmt setDateFormat:@"dd/MM/yyyy"];
    NSString *today = [dtFrmt stringFromDate:[NSDate date]];
    [dtFrmt setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
    NSString *endDay = [NSString stringWithFormat:@"%@ 23:59:59",today];
    NSLog(@"%@",endDay);
    return [dtFrmt dateFromString:endDay];
}

Per un ulteriore approfondimento sull’uso dell’NSDateFormatter potete partire da questo articolo.

Arrivederci al prossimo suggerimento,

Roberto S.



Related Posts Plugin for WordPress, Blogger...

Tagged with: