Obtener datos de la BD
Tags: javascript, webdev, programming, 100daysofcode
Published: 2022-01-04 02:00:24

Existen variar formas de obtener los datos almacenados, a continuación se explicarán cada uno de ellos:

## Dato individual
Para obtener un solo dato (object) específico se usa el método `get(key)`, al cual se le pasa como parámetro el `key` del objeto a obtener.
El dato solicitado es devuelto como resultado de la petición.

> 💡 Este método devuelve `undefined` como resultado si el dato almacenado tiene el valor de *undefined* o no existe.

```jsx
function getStudent(key){
	const request = db.transaction('students')
		           .objectStore('students')
			       .get(key);

	request.onsuccess = ()=> {
		const student = request.result;

		return student;
	}

	request.onerror = (err)=> {
		console.error(`Error to get student information: ${err}`)
	}
}

getStudent('andres@andres.com');
```

## Multiples datos
Para obtener todos los datos de de un _Object Store_ hay dos posibles caminos:

## `getAll()`
Si se desea obtener un arreglo con todos los datos dentro de un _Object Store_, se usa el método `getAll()`, para este caso de uso este método tiene un mejor rendimiento que usar un `cursor` para recorrer por cada uno de los datos almacenados, ya que este ultimo tendrá que crear un objeto por cada dato almacenado conforme va iterando el _Object Store_, mientras que `getAll()` crea todos los objetos a la misma vez y devuelve el arreglo.

```jsx
function getAllStudents(){
	const request = db.transaction('students')
		           .objectStore('students')
			       .getAll();

	request.onsuccess = ()=> {
		const students = request.result;

		console.log('Got all the students');
		console.table(students)

		return students;
	}

	request.onerror = (err)=> {
		console.error(`Error to get all students: ${err}`)
	}
}

getAllStudents();
```

## `cursor`
Si se desea trabajar con todos los datos almacenados en un *Object Store* de forma independiente, es buena idea el uso de un `cursor`, el cual es un mecanismo para iterar sobre múltiples registros en base a su `key`.

Para usar un cursor primero debe crearse con el método `openCursor()` del objeto **objectStore**, una vez hecho el *request* se maneja el evento `success` donde el resultado del *request* es el `cursor`, dentro de este resultado podemos acceder al dato almacenado o solo a su `key`. Cuando no hay más datos o no se obtuvo un resultado en la búsqueda el cursor tiene el valor de `undefined`. Finalmente, para pasar al siguiente dato almacenado se usa el método `continue()` del `cursor`.

Personalmente le encuentro dos casos de uso para el `cursor`:

- Cuando se desea trabajar con los datos de un *Object Store* conforme estos se van obteniendo.
- Cuando se trabaje con los keys de cada objeto almacenado, ya que es usar un `cursor` es más eficiente que el método `getAll()` para este caso en específico.

Para el ejemplo, supongamos que tenemos un método que imprime las propiedades de cada objeto almacenado llamado `printInfo(obj)`:

```jsx
function printStudents(){
	const request = db.transaction('students')
		           .objectStore('students')
			       .openCursor();

	request.onsuccess = ()=> {
		const cursor = request.result;

		if(cursor){
			printInfo(cursor.value);
			cursor.continue();
		}else{
			console.log('No more entries')
		}

	}
}

printStudents();
```