Video: Come vedere, gestire ed eliminare gli abbonamenti in iPhone e iPad 2024
Il record attivo è un modello semplice, in cui la classe dell'oggetto modello in memoria viene estesa con metodi che gestiscono la persistenza della classe. Di seguito è riportato un esempio che utilizza una tabella denominata PERSONTABLE per mantenere gli oggetti di una classe Person in un database relazionale come il data-store. Questo è il file di interfaccia della classe Person:
@interface Person: NSObject {// Attributi del modello @private NSString * Nome; @ private NSString * SSNo;} - (id) init; - (id) initWithOIDNameAndSSNo: (NSString *) OID: (NSString *) aName: (NSString *) aSSNo; - (NSString *) getName; - (NSString *) getSSNo; - (void) setName: (NSString *) aName; - (void) setSsno: (NSString *) aSSNo; - (void) setAsRetired; // Altre operazioni, se presenti -d
Solo i metodi di dominio sono mostrati in questa interfaccia. I metodi aggiuntivi necessari per la persistenza sono definiti nel protocollo Persistable:
typedef enum {NEW, EXISTS, CHANGED, DELETED} STATE; @protocol Persistable // Proprietà richieste dal protocollo @required @property (copia) NSString * OID; // ID univoco nel database @required @property (readonly) STATE state; + (id) findByOID: (NSString *) OID; - (vuoto) inserire; - (vuoto) aggiornamento; - (void) delete; - (void) persist; -d
Questo protocollo dichiara due attributi obbligatori:
-
L'attributo OID : Questo attributo mantiene l'ID persistente dell'oggetto che identificherà univocamente l'oggetto all'interno di un data-store permanente.
-
L'attributo stato : Questo attributo indica se l'oggetto
-
è stato appena creato in memoria (lo stato è NUOVO).
-
Esiste nel database (lo stato è ESISTENTE).
-
È stato modificato in memoria dopo essere stato scaricato dall'archivio dati (lo stato è MODIFICATO).
-
È contrassegnato per la cancellazione (lo stato è ELIMINATO).
-
Il protocollo dichiara quindi una raccolta di metodi che la classe deve implementare. Si utilizza il metodo di classe FindByOid per portare un oggetto dal database in memoria. (Tali metodi sono conosciuti come finder metodi e puoi avere molti tipi diversi di loro, come findByName, findBySSNo e così via.) Lo pseudocodice per implementare questo metodo nella classe Person è mostrato qui:
+ (id) findByOID: (NSString *) anOID {Person * returnedPerson; // Istruzione SQL per recuperare l'oggetto dal database // Salva NAME e SSNO recuperati nelle variabili locali aName e anSSNo … SELECT NAME, SSNO, da PERSONTABLE dove OID =: anOID INTO: aName,: anSSNo; aPerson = [[Assegnazione persona] initWithOIDNameAndSSNo: anOID: anSSNo]; aPerson-> state = ESISTENTE; return returnedPerson;}
La logica di questo metodo è la seguente:
-
L'istruzione SQL SELECT incorporata recupera gli attributi del nome e della sicurezza sociale dell'oggetto dal database e salva questi valori nelle variabili locali aName e anSSNo.
-
Queste variabili insieme all'OID creano un'istanza e inizializzano un oggetto della classe Person e lo restituiscono.
Successivamente, si vede l'implementazione degli altri metodi dal protocollo Persistable, nella classe Person. Il metodo persist viene chiamato ogni volta che l'oggetto deve essere salvato nel database, come mostrato qui:
- (void) persist {// Controlla lo stato dell'oggetto // Se è un nuovo oggetto i. e. state = NEW call [self insert] // per creare una voce in PERSONTABLE // Se stato = EXISTS non fa nulla // Se stato = CHANGED, chiama update per aggiornare il database // Se stato - DELETED, chiama delete per rimuovere le informazioni // nel database}
Il metodo persist usa la variabile di stato per invocare i giusti metodi per la persistenza dell'oggetto.
-
Se l'oggetto è stato appena creato, un record viene inserito nella tabella dell'oggetto usando il metodo insert, come mostrato qui:
- (void) insert {REPLACE INTO PERSONTABLE (OID, NAME, SSNO) VALORI: OID: Nome: SSNo …}
-
Se l'oggetto viene richiamato dal database e quindi modificato in memoria, viene chiamato il metodo di aggiornamento.
- (vuoto) aggiornamento {AGGIORNAMENTO IMPOSTABILE IMPOSTAZIONE VALORI NOME =: Nome, SSNO =: SSNo DOVE OID =: OID …}
-
Se l'oggetto viene richiamato dal database e quindi contrassegnato per l'eliminazione in memoria, l'eliminazione il metodo è chiamato.
- (void) delete {DELETE FROM PERSONTABLE WHERE OID =: OID; …}
Si noti che i metodi del dominio e i metodi del finder dovrebbero impostare lo stato dell'oggetto in modo appropriato. Di conseguenza, init imposta lo stato dell'oggetto su NEW, findByOID imposta lo stato su EXISTING, setAsRetired potrebbe potenzialmente impostare lo stato su DELETED, setName e setSSNo impostare lo stato su CHANGED (se lo stato originale era ESISTENTE), quindi sopra.
I metodi di dominio e i metodi di persistenza sono, quindi, in qualche modo accoppiati.
Quando si utilizza Active Record per archiviare oggetti in un database relazionale, in genere esegue il mapping di un oggetto a una tabella di database, con le variabili persistenti dell'oggetto mappate ai campi in quella tabella.
Tutta la logica di gestione del ciclo di vita dell'oggetto - decidere quando prelevarlo dal database, se consentire un'istanza duplicata in memoria corrispondente allo stesso oggetto nel database, quando salvare, quando eliminare oggetti in modo permanente - le responsabilità dell'applicazione.