1

我正在尝试构建一个使用以下(一对多键值对,即每个 id 有多个图像)数据结构的 IndexedDB 应用程序:

var images = [{"id": "1", "img":["img1","img2","img3"]}, {"id": "1", "img":["img4","img5","img6"]}]

我的问题是如何放置和使用这种结构。那里的所有示例要么遍历所有键,要么具有与每个键关联的单个值,它们可以轻松获取。我可以在 get('id') 方法上打开一个光标并遍历该 id 的所有“img”项吗?这是我目前尝试过的:

1)获取特定键(一对一映射):

var dbGet = function(id, cbGet){             
    var transaction = db.transaction(["images"],"readonly");
    var objectStore = transaction.objectStore("images");
    var request = objectStore.get(id);
    request.onerror = function(event) {};
    request.onsuccess = function(e) {         
    if(typeof(e.target.result) != "undefined"){             
            cbGet(null,null,e.target.result);
         }          
    };  
};

2)获取所有密钥:

var dbGetAll = function(id){
    var transaction = db.transaction(["images"],"readonly");
    var objectStore = transaction.objectStore("images");
    objectStore.openCursor().onsuccess = function(event) {
    var cursor = event.target.result;
      if (cursor) {
        //Do something
        cursor.continue();
      }      
    };
}

3)如何获取特定键的“全部”(一对多映射)?

4

2 回答 2

0

自己找到了答案,将其发布在此处以供可能遇到此问题的其他人使用:

1) 获取给定键的现有值数组:

function getExisting(id, object){
    var existingImgArr = new Array();
    var transaction = db.transaction(["images"],"readonly");
    var objectStore = transaction.objectStore("images");
    var request = objectStore.get(id);
    request.onerror = function(event) {

    };
    request.onsuccess = function(e) {                   
        if(typeof(e.target.result) != "undefined"){ 
            existingImgArr = (e.target.result.img);            
        }           
        dbSaveWithExisting(id, object,existingImgArr);
    };

2)其次,在上面的成功回调上,调用另一个函数附加到现有的vals数组中:

function appendToExisting(id, object, imgArr){
    var transaction = db.transaction(["images"], "readwrite");      

    transaction.oncomplete = function(event) {};
    transaction.onerror = function(event) {};

    var objectStore = transaction.objectStore("images");
    imgArr.push(object.value);
    var data = {"id": id, 
            "img": imgArr
    };  
    var request = objectStore.put(data);
    request.onsuccess = function(event) {};     
}
于 2013-08-10T00:36:58.233 回答
0
  • 使用单个对象存储(图像)
  • 使用自动递增的唯一 ID (guid)
  • 存储一个属性,表示分组项目的 id (itemid)
  • 在 itemid 上创建索引(非唯一)
  • 使用 IDBKeyRange.exact(或我忘记的任何内容)在特定 itemid 上打开光标
  • 遍历光标以获取一组具有相同 id 的项目
于 2013-08-10T01:16:16.430 回答