Compartir a través de


Uso de datos en una aplicación

En el ejemplo de DataAccess_Adv se muestra una aplicación en funcionamiento que permite la entrada del usuario y la funcionalidad CRUD (crear, leer, actualizar y eliminar). La aplicación consta de dos pantallas: una lista y un formulario de entrada de datos. Todo el código de acceso a datos se puede volver a usar en iOS y Android sin modificaciones.

Después de agregar algunos datos, las pantallas de aplicación tienen este aspecto en Android:

Android sample list

Android sample detail

El proyecto de Android se muestra a continuación: el código que se muestra en esta sección se encuentra en el directorio Orm:

Android project tree

El código nativo de la interfaz de usuario para las actividades en Android está fuera del ámbito de este documento. Para más información sobre cómo usar esas clases, consulte la guía de los elementos ListView y Adapter de Android.

Leer

Hay un par de operaciones de lectura en el ejemplo:

  • Lectura de la lista
  • Lectura de registros individuales

Los dos métodos de la clase StockDatabase son:

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 representa los datos como un elemento ListView

Crear y actualizar

Para simplificar el código de la aplicación, se proporciona un único método save que realiza una operación Insert o Update en función de si se ha establecido el valor PrimaryKey. Dado que la propiedad Id está marcada con un atributo [PrimaryKey], no debe establecerla en el código. Este método detectará si el valor se ha guardado anteriormente (mediante la comprobación de la propiedad de clave principal) e insertará o actualizará el objeto en consecuencia:

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

Las aplicaciones reales normalmente requerirán algún tipo de validación (como campos obligatorios, longitudes mínimas u otras reglas de negocio). Las aplicaciones multiplataforma correctas implementan la mayor parte posible de la validación lógica en el código compartido y devuelven los errores de validación a la interfaz de usuario para mostrarlos según las funcionalidades de la plataforma.

Eliminar

A diferencia de los métodos Insert y Update, el método Delete<T> solo puede aceptar el valor de clave principal en lugar de un objeto Stock completo. En este ejemplo, se pasa un objeto Stock al método, pero solo se pasa la propiedad Id al método Delete<T>.

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

Uso de un archivo de base de datos SQLite relleno previamente

Algunas aplicaciones se distribuyen con una base de datos ya rellena. Para contar con esta opción fácilmente en su aplicación móvil, puede suministrar un archivo de base de datos SQLite existente con la aplicación y copiarlo en un directorio grabable antes de acceder a él. Dado que SQLite es un formato de archivo estándar que se usa en muchas plataformas, hay varias herramientas disponibles para crear un archivo de base de datos de SQLite:

  • Extensión SQLite Manager de Firefox: funciona en Mac y Windows y genera archivos compatibles con iOS y Android.

  • Línea de comandos: consulte www.sqlite.org/sqlite.html .

Al crear un archivo de base de datos para distribuirlo con la aplicación, tenga cuidado con la nomenclatura de las tablas y las columnas para asegurarse de que coinciden con lo que espera el código, sobre todo si usa SQLite.NET, que espera que los nombres coincidan con las propiedades y clases de C# (o los atributos personalizados asociados).

Para asegurarse de que algún código se ejecute antes de cualquier otra cosa en la aplicación Android, puede colocarlo en la primera actividad para cargar o puede crear una subclase Application que se cargue antes de cualquier actividad. El código siguiente muestra una subclase Application que copia un archivo de base de datos existente data.sqlite fuera del directorio /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();
    }
}