2017-01-30 3 views
0

Kann jemand vorschlagen, wie mehrere Schlüsselwert von IndexedDB-Objektspeicher abgerufen werden? Ich habe mehrere Optionen gemacht, aber nicht gearbeitet. Erstellt IndexedDB hierSo erhalten Sie mehrere Schlüsselwerte von IndexedDb Objektspeicher

$provide.value('dbModel', { 
     name: 'TestDB', 
     version: '1', 
     instance: {}, 
     objectStoreName: { 
      dashboards: 'Appointment' 
     }, 
     upgrade: function (e) { 
      var db = e.target.result; 
      if (!db.objectStoreNames.contains('Appointment')) { 
       var calendarobj = db.createObjectStore('Appointment', { 
        keyPath: 'AppointmentId' 
       }); 
       calendarobj.createIndex("AppointmentId", "AppointmentId", { multiEntry: true }); 
      } 
     } 
    }); 

und die Daten sieht aus wie

KeyPath-AppointmentId    Value 
=====================    ===== 
1         Test 1 
2         Test 2 
3         Test 3 

I getObjectStore Methode haben die objectstorename Instanz zu erhalten.

getObjectStore: function (objectStoreName, mode) { 
      var modeact = mode || _db.transactionTypes.readonly; 
      var txn = _db.instance.transaction(objectStoreName, modeact); 
      var store = txn.objectStore(objectStoreName); 

      return store; 
     } 


var keys = [1,2]; // Want to get the First two record which has value 'Test 1' and 'Test 2' 
var store = _db.getObjectStore(objectStoreName); 
var tagIndex = store.index(store.keyPath); //AppointmentId 

var request = tagIndex.openCursor(IDBKeyRange.only(keys)); 
//var request = tagIndex.get(keys); 

request.onsuccess = function (event) { 
       console.log(event.result); 
} 
+1

Bitte fügen Sie einen Kommentar hinzu, wenn Sie abstimmen. Damit ich meine Frage verbessern kann. – Pradeep

Antwort

2

Mit [1, 2] wie Sie nicht funktionieren tun wird -, dass ein Schlüssel ist, die ein Array mit zwei Mitgliedern sein geschieht. Die indizierte Datenbank versteht derzeit nicht die Verwendung von Listen oder Schlüsselsätzen für die Abfrage.

Sie haben eine Handvoll Optionen:

1 - Ausgabe zwei get Anforderungen parallel. (Da die Reihenfolge garantiert wird, beendet die zweite Anforderung nach dem ersten und Sie wissen beiden Ergebnisse zurückgegeben wurden.)

var results = []; 
store.get(1).onsuccess = function(e) { 
    results.push(e.target.result); 
}; 
store.get(2).onsuccess = function(e) { 
    results.push(e.target.result); 

    // results will have the values 
}; 

2 - Verwenden Sie einen Cursor und eine Auswahl:

var results = []; 
store.openCursor(IDBKeyRange.bound(1, 2)).onsuccess = function(e) { 
    var cursor = e.target.result; 
    if (cursor) { 
    results.push(cursor.value); 
    cursor.continue(); 
    } else { 
    // results will have the values 
    } 
}; 

3 - verwenden Sie getAll mit einem Bereich (neuere Browser nur - zurückgreifen auf einen Cursor, falls nicht verfügbar)

store.getAll(IDBKeyRange.bound(1, 2)).onsuccess = function(e) { 
    // e.target.result will have the entries 
}; 

Beachten Sie, dass in den Optionen 2 und 3, die einen Bereich verwenden, würden Sie auch eine Aufzeichnung mit einem Schlüssel vonerhaltenwenn einer existiert.

Verwandte Themen