Uso di Dati in un'app iOS

L'esempio di DataAccess_Adv mostra un'applicazione funzionante che consente l'input dell'utente e la funzionalità di database CRUD (Create, Read, Update and Delete). L'applicazione è costituita da due schermate: un elenco e un modulo di immissione dati. Tutto il codice di accesso ai dati è utilizzabile nuovamente in iOS e Android senza modifiche.

Dopo aver aggiunto alcuni dati, le schermate dell'applicazione hanno un aspetto simile al seguente in iOS:

iOS sample list

iOS sample detail

Il progetto iOS è illustrato di seguito: il codice illustrato in questa sezione è contenuto nella directory Orm :

iOS project tree

Il codice dell'interfaccia utente nativo per ViewControllers in iOS non rientra nell'ambito di questo documento. Per altre informazioni sui controlli dell'interfaccia utente, vedere la guida uso di tabelle e celle di iOS.

Lettura

Nell'esempio sono disponibili due operazioni di lettura:

  • Lettura dell'elenco
  • Lettura di singoli record

I due metodi nella StockDatabase classe sono:

public IEnumerable<Stock> GetStocks ()
{
    lock (locker) {
        return (from i in Table<Stock> () select i).ToList ();
    }
}
public Stock GetStock (int id)
{
    lock (locker) {
        return Table<Stock>().FirstOrDefault(x => x.Id == id);
    }
}

iOS esegue il rendering dei dati in modo diverso come .UITableView

Creazione e Aggiornamento

Per semplificare il codice dell'applicazione, viene fornito un singolo metodo di salvataggio che esegue un'operazione Insert o Update a seconda che sia stato impostato PrimaryKey. Poiché la Id proprietà è contrassegnata con un [PrimaryKey] attributo non deve essere impostata nel codice. Questo metodo rileverà se il valore è stato salvato in precedenza (controllando la proprietà della chiave primaria) e inserendo o aggiornando di conseguenza l'oggetto:

public int SaveStock (Stock item)
{
    lock (locker) {
        if (item.Id != 0) {
            Update (item);
            return item.Id;
    } else {
            return Insert (item);
        }
    }
}

Le applicazioni reali richiedono in genere una convalida, ad esempio campi obbligatori, lunghezze minime o altre regole business. Le buone applicazioni multipiattaforma implementano la maggior parte della convalida logica possibile nel codice condiviso, passando gli errori di convalida di backup all'interfaccia utente per la visualizzazione in base alle funzionalità della piattaforma.

Elimina

A differenza dei Insert metodi e Update , il Delete<T> metodo può accettare solo il valore della chiave primaria anziché un oggetto completo Stock . In questo esempio un Stock oggetto viene passato al metodo, ma solo la proprietà Id viene passata al Delete<T> metodo .

public int DeleteStock(Stock stock)
{
    lock (locker) {
        return Delete<Stock> (stock.Id);
    }
}

Uso di un file di database SQLite prepopolato

Alcune applicazioni vengono fornite con un database già popolato con i dati. È possibile eseguire facilmente questa operazione nell'applicazione per dispositivi mobili inviando un file di database SQLite esistente con l'app e copiandolo in una directory scrivibile prima di accedervi. Poiché SQLite è un formato di file standard usato in molte piattaforme, sono disponibili diversi strumenti per creare un file di database SQLite:

  • Estensione Firefox di SQLite Manager: funziona su Mac e Windows e produce file compatibili con iOS e Android.
  • Riga di comando: vedere www.sqlite.org/sqlite.html .

Quando si crea un file di database per la distribuzione con l'app, prestare attenzione alla denominazione di tabelle e colonne per assicurarsi che corrispondano a quanto previsto dal codice, soprattutto se si usa SQLite.NET che prevede che i nomi corrispondano alle classi e alle proprietà C# (o agli attributi personalizzati associati).

Per iOS, includere il file sqlite nell'applicazione e assicurarsi che sia contrassegnato con Azione di compilazione: Contenuto. Inserire il codice in per copiare il file in FinishedLaunching una directory scrivibile prima di chiamare qualsiasi metodo di dati. Il codice seguente copia un database esistente denominato data.sqlite, solo se non esiste già.

// Copy the database across (if it doesn't exist)
var appdir = NSBundle.MainBundle.ResourcePath;
var seedFile = Path.Combine (appdir, "data.sqlite");
if (!File.Exists (Database.DatabaseFilePath))
{
  File.Copy (seedFile, Database.DatabaseFilePath);
}

Qualsiasi codice di accesso ai dati (ADO.NET o uso di SQLite.NET) eseguito dopo il completamento avrà accesso ai dati precompilato.