Condividi tramite


Uso dei dati in un'app

L'esempio di DataAccess_Adv mostra un'applicazione funzionante che consente 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 Android:

Android sample list

Android sample detail

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

Android project tree

Il codice nativo dell'interfaccia utente per le attività in Android non rientra nell'ambito di questo documento. Per altre informazioni sui controlli dell'interfaccia utente, vedere la guida android ListViews e Adapters .

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);
    }
}

Android esegue il rendering dei dati come .ListView

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 assicurarsi che il codice venga eseguito prima di qualsiasi altra operazione nell'app Android, è possibile inserirlo nella prima attività da caricare oppure creare una Application sottoclasse caricata prima di qualsiasi attività. Il codice seguente mostra una sottoclasse Application che copia un file di database esistente data.sqlite dalla directory /Resources/Raw/ .

[Application]
public class YourAndroidApp : Application {
    public override void OnCreate ()
    {
        base.OnCreate ();
        var docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        Console.WriteLine ("Data path:" + Database.DatabaseFilePath);
        var dbFile = Path.Combine(docFolder, "data.sqlite"); // FILE NAME TO USE WHEN COPIED
        if (!System.IO.File.Exists(dbFile)) {
            var s = Resources.OpenRawResource(Resource.Raw.data);  // DATA FILE RESOURCE ID
            FileStream writeStream = new FileStream(dbFile, FileMode.OpenOrCreate, FileAccess.Write);
            ReadWriteStream(s, writeStream);
        }
    }
    // readStream is the stream you need to read
    // writeStream is the stream you want to write to
    private void ReadWriteStream(Stream readStream, Stream writeStream)
    {
        int Length = 256;
        Byte[] buffer = new Byte[Length];
        int bytesRead = readStream.Read(buffer, 0, Length);
        // write the required bytes
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = readStream.Read(buffer, 0, Length);
        }
        readStream.Close();
        writeStream.Close();
    }
}