DEV Community

Andrés Valdivia Cuzcano
Andrés Valdivia Cuzcano

Posted on

Obtener datos de la BD

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.

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');
Enter fullscreen mode Exit fullscreen mode

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.

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();
Enter fullscreen mode Exit fullscreen mode

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):

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();
Enter fullscreen mode Exit fullscreen mode

Top comments (0)