2012-07-18 25 views
10
kullanma IndexedDB yılında ObjectStore-Varolan Öncesi Index Ekle

gördüğüm birden JavaScript örnekleri createObjectStore'u arayarak önceden mevcut bir tabloya createIndex'u kullanır mıydınız? Bence asıl soru, createObjectStore kullanmadan objectStore'a nasıl başvuru yapılacağıdır? ilk etapta nesne deposu yapıyoruz aynı yerde olması gereken onupgradeneeded sırasındaJavascript

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

request.onupgradeneeded =: Eğer eski veya yeni W3 özelliklerini kullanarak bir ObjectStore bir başvuru almak istiyorsa, bu eski setVersion komutunu veya yeni onupgradeneeded olay aracılığıyla kullanarak onSuccess olayları yoluyla olası bir geçici çözüm olduğunu function (evt) { var objectStore = evt.currentTarget.transaction.objectStore ("insanlar"); objectStore.createIndex ("şehir", "şehir", {unique: false}); }; // Hızlı yanıtlama – Garry

cevap

4

Sen yap:

hiçbir şans ile aşağıdakilerden çeşitli varyasyonlar denedik. Burada, yeni bir dizin oluşturmak gibi, yükseltmek için gerekli olan her türlü işlemi yapabilirsiniz. Here is an example.

+0

oncalden besleme henüz Chrome'da bile ateş etmiyor. En yeni W3 özelliklerinin bir parçasıdır. Bir nesne deposu referansına olaylardan başka bir şey kullanarak nasıl ulaşılacağını anlayabilseydim hoş olurdu. –

+0

Ve bunların hiçbiri IE veya Opera veya Safari'de hiç çalışmıyor, bu yüzden IndexedDB'yi kullanmak, bazı tarayıcılar arası uyumluluktan ödün verdiğinizi ima ediyor. Chrome’un yakında "desteklendiğini" desteklemesi bekleniyor. Bunun için Chrome 22'yi hedeflediklerini okudum, bu yüzden belki de her şey birkaç ay içinde Chrome'da çalışacak. O zamana kadar, [bu] gibi bir şey yaparak etrafta dolaşabilirsiniz (http://blog.nparashuram.com/2012/05/indexeddb-setversion-vs-onupgradeneeded.html). – dumbmatter

+0

Ve daha önce yeterince açık olmadığımdan, sanırım ... veritabanını yükselttiğinizde sadece nesne deponuzla karışabilirsiniz. Başka bir çözüm yok. ['onupgradeneeded' 'çok önemlidir, çünkü kodunuzda nesne depoları ve indeksler oluşturabileceğiniz tek yer var.”] (https://developer.mozilla.org/en/IndexedDB/Using_IndexedDB) – dumbmatter

2

Chrome, şu anda satın alınan olayı desteklemiyor.

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"); 
}