IndexedDB - índice de búsqueda event.target.result siempre nulo

No puedo entender qué está mal con este fragmento de código. Tengo una instancia de indexedDB. El keyPath se genera automáticamente. Puedo agregar objetos a la base de datos con éxito y obtener todos los objetos en la base de datos, pero no puedo buscar con éxito un objeto en un índice que creé.

Ver mi jsfiddle: http://jsfiddle.net/R5ngM/13/

preguntado el 11 de junio de 12 a las 18:06

Actualicé el código para confirmar que el índice "lname" se creó correctamente: jsfiddle.net/R5ngM/16 -

gracias por incluir un violín. Le daré un vistazo -

2 Respuestas

Todavía no lo he logrado perfectamente, pero el problema parece ser que está abriendo el cursor en su almacén de objetos, en lugar del índice. Con el keyPath predeterminado que funciona bien, pero no funcionará cuando intente usar un índice secundario.

Lo que creo que estás buscando hacer debería verse así:

    var request = null;
    if ( null === index || 'undefined' === typeof index ) {
        request = transaction.openCursor( keyRange );
    } else {
        request = index.openCursor( keyRange );
    }
    request.onsuccess = on_success;

ACTUALIZACIÓN: Pasé mucho tiempo buscando en el lugar equivocado después de encontrar el problema anterior con el cursor de índice. Aquí está el problema: El objeto que está almacenando es una matriz, no un objeto literal.

Estaba mirando el objeto que estabas almacenando y noté esto:

        var entry = '<li>'+row[0].fname+' '+row[0].lname+'</li>';

Vea cómo está accediendo al primer elemento de la row ¿formación? Estás almacenando una matriz. Su ruta clave (y yo) asumimos que se almacenó un objeto. Creo que es posible tener un índice en una matriz, pero en cualquier caso, su keyPath esta apagado.

Aquí hay un fragmento de código de trabajo muy similar. Lo arruiné un poco durante la depuración, pero obtendrás la esencia. (Es un buen fragmento, así que si no le importa, lo usaré como base de otros ejemplos de StackOverflow más adelante).

Mantenga el cursor en el índice como se explica en mi respuesta anterior. Luego cambie a esta línea:

var entry = '<li>'+row[0].fname+' '+row[0].lname+'</li>';

Y el cambio esto:

var newUser = [{fname:$('#fname').val(),lname:$('#lname').val()}];

A esto:

var newUser = {fname:$('#fname').val(),lname:$('#lname').val()};

Respondido el 13 de junio de 12 a las 01:06

Abrí un cursor en el índice para intentar ver el contenido, pero es nulo. jsfiddle.net/R5ngM/17 Desearía que jsfiddle tuviera números de línea. Supongo que solo tengo un índice vacío... - Ninja ginja

Ninguno de mis intentos está devolviendo un IDBCursorWithValue objeto sin embargo, todos devuelven algo en onsuccess y no onerrors. Me inclino hacia la misma conclusión, pero la pregunta es ¿por qué? - Buley

Acabo de probar la última versión de FF para ver si las correcciones de mi navegador eran malas y FF no parece reconocer ningún intento que haga para inicializar indexedDB a pesar de que estoy usando ejemplos de documentos de Mozilla. Esto apesta. - Ninja ginja

Su código no funcionará en FF porque es la versión de diciembre de 2011 de la API de IDB y no la más reciente. La diferencia es que para instalar DB, el primero usa un setVersion pide (lo que tienes) y este último utiliza un onupgradeneeded llamar de vuelta. Intente mirar mi biblioteca WIP si tiene problemas. Biblioteca: github.com/editor/InDB/blob/master/indb.dev.js Ejemplo de esqueleto de aplicación: github.com/editor/InDB/blob/master/indbapp.dev.js - Buley

Tenga en cuenta que en el objeto de evento está diciendo returnValue: true - Buley

También debe tenerse en cuenta que el problema anterior puede incluso surgir cuando abre un cursor en el índice. Si abre el cursor en el índice y aún así siempre obtiene un valor nulo, debe verificar dos veces el tipo de datos en el que creó el índice y el tipo de datos en el que está creando su cursor de índice. En mi caso, había creado el índice en el tipo de datos de cadena y estaba abriendo un cursor en el índice con int y me estaba volviendo loco.

Respondido 10 Feb 15, 11:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.