2012-07-18 10 views
10

que he visto varios ejemplos de JavaScript de la utilización de createIndex definir un índice ObjectStore directamente después de la ObjectStore ha sido creado de esta manera:Añadir índice preexistentes ObjectStore En IndexedDB uso de JavaScript

var objectStore = ixDb.createObjectStore(osName, { keyPath: pkName, autoIncrement: autoIncrement }); 

objectStore.createIndex("name", "name", { unique: false }); 

¿Puede alguien me cómo mostrar ¿usaría createIndex en una tabla preexistente sin llamar al createObjectStore? Supongo que la verdadera pregunta aquí es cómo obtener una referencia a ObjectStore sin usar createObjectStore?

He intentado varias variaciones de la siguiente sin suerte:

var objectStore = window.IDBTransaction.objectStore(ObjectStoreName); 
var index = objectStore.createIndex(ixName, fieldName, { unique: unique, multiEntry: multiEntry }); 
+0

request.onupgradeneeded = function (evt) { var objectStore = evt.currentTarget.transaction.objectStore ("personas"); objectStore.createIndex ("ciudad", "ciudad", {único: falso}); }; // Respuesta rápida – Garry

Respuesta

4

lo haces durante onupgradeneeded, que debe ser el mismo lugar en el que está haciendo el almacén de objetos en el primer lugar. Allí, puede hacer lo que sea necesario para actualizarlo, como crear un nuevo índice. Here is an example.

+0

onupgradeneeded ni siquiera se inicia en Chrome todavía. Es parte de la nueva especificación W3. Sería bueno si pudiera averiguar cómo obtener una referencia de almacén de objetos utilizando algo que no sea eventos. –

+0

Y nada de esto funciona en IE, Opera o Safari, por lo que usar IndexedDB implica que sacrificas compatibilidad entre navegadores. Es de esperar que Chrome pronto admita 'onupgradeneeded'. Creo que he leído que están orientados a Chrome 22 para esto, así que quizás todo esto funcione en Chrome en unos meses. Hasta entonces, puedes hackearlo haciendo algo como [esto] (http://blog.nparashuram.com/2012/05/indexeddb-setversion-vs-onupgradeneeded.html). – dumbmatter

+0

Y como no fui lo suficientemente explícito antes, supongo ... usted solo puede meterse con su tienda de objetos cuando está actualizando la base de datos. No hay otra solución. ['onupgradeneeded'" es muy importante, porque es el único lugar en su código que puede crear almacenes de objetos e índices. "] (https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB) – dumbmatter

2

Actualmente, Chrome no admite el evento onupgradeneeded. Si se quería obtener una referencia a un ObjectStore usando las viejas o nuevas especificaciones W3, esta es una posible solución a través del evento onSuccess utilizando el comando setVersion edad oa través del nuevo evento onupgradeneeded:

var ixDb; 
var ixDbRequest; 
var ixDbVersionTansaction; 

//Check to see if we have a browser that supports IndexedDB 
if (window.indexedDB) { 

ixDbRequest = window.indexedDB.open(dbName, dbVersion); 

//For browsers like chrome that support the old set version method 
ixDbRequest.onsuccess = function (e) { 

    ixDb = ixDbRequest.result || e.result; 

    if (typeof ixDb.setVersion === "function") { 

     //Put your version checking logic here 

     if (oldVersion < newVersion) { 
      var verRequest = ixDb.setVersion(newVersion); 

      verRequest.onerror = function (e) { 
       //handling error logic here 
      } 

      verRequest.onsuccess = function (e) { 
       //Get a reference to the version transaction 
       //from the old setVersion method. 
       ixDbVersionTansaction = verRequest.result; 
       //Create database using function provided by the user. 
       UserFunction(); 
      } 
     } 
    } 
}; 

ixDbRequest.onupgradeneeded = function (e) { 
    //FF uses this event to fire the transaction for upgrades. 
    //All browsers will eventually use this method. Per - W3C Working Draft 24 May 2012 
    ixDb = ixDbRequest.result || e.currentTarget.result; 

    //Get a reference to the version transaction via the onupgradeneeded event (e) 
    ixDbVersionTansaction = e.currentTarget.transaction; 

    //Create database using function provided by the user. 
    UserFunction(); 
}; 

UserFunction(){ 
    //ObjectStore is accessed via ixDbVersionTansaction variable 
    // in either instance (transaction..objectStore("ObjectStoreName")) 
    var ObjectStore = ixDbVersionTansaction.objectStore("ObjectStoreName"); 
    var index = ObjectStore.createIndex("ixName", "fieldName"); 
} 
Cuestiones relacionadas