首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在indexdb for browsers中使用类似where子句的条件

如何在indexdb for browsers中使用类似where子句的条件
EN

Stack Overflow用户
提问于 2015-05-17 22:50:18
回答 2查看 290关注 0票数 0

我使用的是indexdb,因为它支持所有浏览器。我已经成功地添加了数据并从indexdb获得了数据,但我想使用where子句条件。比如我有产品名称,病原体,疾病,路线,所以我想要获取产品名称是Ali,疾病是皮肤的数据。它们是我从不同的站点得到的,它用两个输入域中提供的值开始和结束来显示所有的记录。

这是我正在使用的代码。

代码语言:javascript
复制
     <!doctype html>
     <html>
     <head>
     </head>
     <body>
     <script>
     var db;

    function indexedDBOk() {
    return "indexedDB" in window;
    }

    document.addEventListener("DOMContentLoaded", function() {

    //No support? Go in the corner and pout.
    if(!indexedDBOk) return;

    var openRequest = indexedDB.open("products",1);
    //var openRequest = indexedDB.open("idarticle_people5",1);


    openRequest.onupgradeneeded = function(e) {
    var thisDB = e.target.result;

    if(!thisDB.objectStoreNames.contains("products")) {
        var os = thisDB.createObjectStore("products", {autoIncrement:true});
        //I want to get by name later
        os.createIndex("name", "name", {unique:false});
        //I want email to be unique
        os.createIndex("pathogen", "pathogen", {unique:false});
        os.createIndex("disease", "disease", {unique:false});
        os.createIndex("route", "route", {unique:false});
    }
    }

    openRequest.onsuccess = function(e) {
    db = e.target.result;

    //Listen for add clicks
    document.querySelector("#addButton").addEventListener("click", addPerson, false);

    //Listen for get clicks
    document.querySelector("#getButton").addEventListener("click", getPerson, false);

    }   

    openRequest.onerror = function(e) {
    //Do something for the error
    }


   },false);


 function addPerson(e) {
 var name = document.querySelector("#name").value;
 var pathogen = document.querySelector("#pathogen").value;
 var disease = document.querySelector("#disease").value;
 var route = document.querySelector("#route").value;


console.log("About to add "+name+"/"+pathogen);

//Get a transaction
//default for OS list is all, default for type is read
var transaction = db.transaction(["products"],"readwrite");
//Ask for the objectStore
var store = transaction.objectStore("products");

//Define a person
var person = {
    name:name,
    pathogen:pathogen,
    disease:disease,
    route:route
}

//Perform the add
var request = store.add(person);

request.onerror = function(e) {
    alert("Sorry, that email address already exists.");
    console.log("Error",e.target.error.name);
    console.dir(e.target);
    //some type of error handler
}

request.onsuccess = function(e) {
    console.log("Woot! Did it");
 }
 }

function getPerson(e) {

.value名称= var (“#nameSearch”)var;

代码语言:javascript
复制
var endname = document.querySelector("#diseaseSearch").value;

if(name == "" && endname == "") return;

var transaction = db.transaction(["products"],"readonly");
var store = transaction.objectStore("products");
var index = store.index("name");





//Make the range depending on what type we are doing
var range;
if(name != "" && endname != "") {
    range = IDBKeyRange.bound(name, endname);
    } else if(name == "") {
    range = IDBKeyRange.upperBound(endname);
    }   else {
    range = IDBKeyRange.lowerBound(name);
    }
    var s = "";

  index.openCursor(range).onsuccess = function(e) {
    var cursor = e.target.result;
    if(cursor) {
        s += "<h2>Key "+cursor.key+"</h2><p>";
        for(var field in cursor.value) {
            s+= field+"="+cursor.value[field]+"<br/>";
        }
        s+="</p>";
        cursor.continue();
    }
    document.querySelector("#status").innerHTML = s;
    } 

    }


    </script>

    <input type="text" id="name" placeholder="Name"><br/>
    <input type="text" id="pathogen" placeholder="Pathogen"><br/>
    <input type="text" id="disease" placeholder="Disease"><br/>
    <input type="text" id="route" placeholder="Route"><br/>

    <button id="addButton">Add Data</button>

     <p/>

   <input type="text" id="nameSearch" placeholder="Name"><br/>
   <input type="text" id="diseaseSearch" placeholder="Disease"><br/>
   <button id="getButton">Get By Name</button>

   <p/>

  <div id="status"></div>


 </body>
 </html>
EN

回答 2

Stack Overflow用户

发布于 2015-05-18 19:10:09

您可以使用三个参数尝试以下步骤:

  • databaseid
  • tableid -存储名称
  • 回调函数,返回所选data
  • 条件函数数组。对于ok记录返回true,对于其他记录返回false。

代码如下:

代码语言:javascript
复制
function selectFromTable (databaseid, tableid, cb, cond) {
    var request = window.indexedDB.open(databaseid);
    request.onsuccess = function(event) {
        var res = [];
        var ixdb = event.target.result;
        var tx = ixdb.transaction([tableid]);
        var store = tx.objectStore(tableid);
        var cur = store.openCursor();
        cur.onblocked = function(event) {
    }
    cur.onerror = function(event) {
    }
    cur.onsuccess = function(event) {
        var cursor = event.target.result;
        if(cursor) {
            if(cond(cursor.value) ) res.push(cursor.value);
            cursor.continue();
        } else {
            ixdb.close();
            cb(res);
        }
    }
}       
票数 0
EN

Stack Overflow用户

发布于 2015-05-27 02:21:26

尝试使用browser database API adapter并从its wiki page阅读有关其用法的信息。您需要包含所有3个JS文件才能开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30288133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档