Uso de datos en una aplicación de iOS

En el ejemplo de DataAccess_Adv se muestra una aplicación en funcionamiento que permite las entradas de usuario y la funcionalidad CRUD (creación, lectura, actualización y eliminación) para bases de datos. 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 reutilizar en iOS y Android sin modificaciones.

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

iOS sample list

iOS sample detail

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

iOS project tree

El código nativo de la interfaz de usuario de ViewControllers en iOS está fuera del ámbito de este documento. Consulte la guía Trabajar con tablas y celdas en iOS para obtener más información sobre los controladores de la interfaz de usuario.

Leer

En el ejemplo se incluyen un par de operaciones de lectura:

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

iOS representa los datos de forma distinta como UITableView.

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 iOS, incluya el archivo sqlite en la aplicación y asegúrese de que está marcado con Acción de compilación: contenido. Antes de poder llamar a cualquier método de datos, debe colocar el código en FinishedLaunching para copiar el archivo en un directorio grabable. El código siguiente copiará una base de datos existente denominada data.sqlite, solo en caso de que no exista aún.

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

Cualquier código de acceso a datos (ya sea ADO.NET o con SQLite.NET) que se ejecute después de haber completado esta operación tendrá acceso a los datos rellenos previamente.