2012-07-18 7 views
10

widziałem wiele JavaScript przykłady użycia createIndex zdefiniować indeks ObjectStore bezpośrednio po ObjectStore został stworzony tak:Dodaj indeks do wcześniej istniejących ObjectStore W IndexedDB użyciu JavaScript

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

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

Czy ktoś może mi pokazać, jak użyjesz createIndex na wcześniej istniejącej tabeli bez wywoływania createObjectStore? Chyba prawdziwym pytaniem jest tutaj, jak uzyskać odniesienie do objectStore bez używania createObjectStore?

Próbowałem kilka odmian następujących bez powodzenia:

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 ("ludzie"); objectStore.createIndex ("city", "city", {unique: false}); }; // Szybka odpowiedź – Garry

Odpowiedz

4

to zrobić podczas onupgradeneeded, które powinny być w tym samym miejscu robicie sklep obiekt w pierwszej kolejności. W tym miejscu możesz zrobić, co jest potrzebne, aby przeprowadzić aktualizację, na przykład utworzyć nowy indeks. Here is an example.

+0

onupgradeneeded nawet nie uruchamia się jeszcze w Chrome. Jest to część najnowszej specyfikacji W3. Byłoby miło, gdybym mógł dowiedzieć się, jak uzyskać odniesienie do obiektu magazynowego za pomocą czegoś innego niż zdarzenia? –

+0

I żaden z nich nie działa w ogóle w IE, Opera lub Safari, więc używanie IndexedDB w ogóle oznacza, że ​​rezygnujesz z kompatybilności z różnymi przeglądarkami. Chrome ma nadzieję, że wkrótce będzie obsługiwał 'onupgradeneeded'. Wydaje mi się, że czytałem, że kieruje na niego przeglądarkę 22, więc może wszystko będzie działać w Chrome w ciągu kilku miesięcy. Do tego czasu możesz zhakować dookoła, wykonując coś w stylu [this] (http://blog.nparashuram.com/2012/05/indexeddb-setversion-vs-onupgradeneeded.html). – dumbmatter

+0

A ponieważ nie byłem wystarczająco wyraźny wcześniej, przypuszczam, że ... możesz tylko zadzierzgać ze swoim magazynem obiektów podczas aktualizacji bazy danych. Nie ma innego rozwiązania. ['onupgradeneeded'' jest bardzo ważny, ponieważ jest to jedyne miejsce w twoim kodzie, dzięki któremu możesz tworzyć magazyny obiektów i indeksy."] (https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB) – dumbmatter

2

Chrome obecnie nie obsługuje zdarzenia onupgradeneeded. Jeśli chciał uzyskać odwołanie do ObjectStore przy użyciu starych lub nowych W3 widowisko, to jest jeden z możliwych obejście poprzez onSuccess zdarzenia przy użyciu starej komendy setVersion lub za pośrednictwem nowego onupgradeneeded imprezy:

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"); 
} 
Powiązane problemy