> For the complete documentation index, see [llms.txt](https://ajgallego.gitbook.io/sencha-touch-2/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ajgallego.gitbook.io/sencha-touch-2/capitulo_almacenamiento/capitulo_almacenamiento_data_store.md).

# Data Store

Los almacenes de datos (*data store*) se utilizan para encapsular o almacenar una colección de instancias de un modelo determinado. Además disponen de funciones para ordenar, filtrar y consultar los datos. De forma opcional podemos indicar que utilicen un *proxy* para sincronizar estos datos con un almacén local o remoto.

En esta sección nos vamos a centrar en las características para gestionar un *store*: añadir, ordenar, filtrar, buscar y eliminar. En la siguiente sección sobre *proxies* veremos como hacer persistentes estos datos.

## Crear un *Data Store*

Crear un almacén de datos es fácil, utilizaremos el constructor `Ext.create('Ext.data.Store', {...})` y como segundo parámetro le pasaremos las opciones de configuración indicando el nombre del modelo:

```javascript
var myStore = Ext.create('Ext.data.Store', {
    model: 'User'
});
```

## Añadir datos

Podemos añadir datos directamente junto a la definición de un *Store*, solo tenemos insertarlos como un array a través de su propiedad *"data"*. Suponiendo que el modelo "User" solo tuviera dos campos (*id*, *name*), podríamos añadir datos de la forma:

```javascript
var myStore = Ext.create('Ext.data.Store', {
    model: 'User',
    data: [
        {id: 1, name: 'Javier Gallego'},
        {id: 2, name: 'Fran García'},
        {id: 3, name: 'Boyan Ivanov'},
        {id: 4, name: 'Miguel Lozano'}
    ]
});
```

O también podemos añadir datos posteriormente llamando a la función "`add`" del objeto:

```javascript
myStore.add({id: 5, name: 'Javier Aznar'},
            {id: 6, name: 'Pablo Suau'});
```

## Ordenar y Filtrar elementos

Para ordenar y filtrar los datos usamos las propiedades "`sorters`" y "`filters`". En el siguiente ejemplo se ordenan los datos de forma descendente por nombre de usuario (también podría ser `ASC`) y se realiza un filtrado por género (los filtros también admiten expresiones regulares).

```javascript
Ext.create('Ext.data.Store', {
    model: 'User',
    sorters: [
        { property: 'usuario', direction: 'DESC' }
    ],
    filters: [
        { property: 'genero', value: 'Femenino' }
    ]
});
```

## Buscar registros

En algunos casos antes de añadir un registro será necesario comprobar si el registro está repetido. Para esto podemos utilizar el método `findRecord(campo, valor)` del *Store*, el cual devuelve el registro encontrado o *null* en caso de no encontrar ninguna coincidencia. En el siguiente ejemplo se compara el campo *id* de los datos del *Store*, con el campo *id* del registro a añadir:

```javascript
if (myStore.findRecord('id', registro.data.id) === null)
{
    myStore.add( registro );
}
```

Otra opción para buscar registros es la función `find(campo, valor)` la cual devuelve el índice del registro encontrado (o -1 en caso de no encontrarlo), y posteriormente podríamos llamar a `getAt(index)` para obtener los datos.

## Eliminar registros

Para eliminar un registro de un *Store* usaremos la función `remove(registro)`, por ejemplo:

```javascript
myStore.remove( registro );
```

Es recomendable comprobar si existe el registro a eliminar, para esto usaremos la función `findRecord()`. Normalmente el *Store* estará asignado a algún panel que nos permita ver los datos (como un listado). Si quisiésemos eliminar un registro de este listado, primero tendríamos que obtener el *Store* usado, a continuación comprobar si existe el registro y si es así eliminarlo. Por último habría que sincronizar los datos para que se actualicen, de la forma:

```javascript
var store = miListado.getStore();

if( store.findRecord('id', registro.data.id) )
{
    store.remove( registro );
}

store.sync();
miListado.refresh();
```

También podemos utilizar la función `removeAt(index)` para eliminar los registros de un *Store* a partir de su índice.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ajgallego.gitbook.io/sencha-touch-2/capitulo_almacenamiento/capitulo_almacenamiento_data_store.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
