YDN-DB如何验证记录是否存在?

时间:2013-10-05 21:58:42

标签: javascript asynchronous indexeddb ydn-db

我正在尝试验证给定ID是否在表内存在特定记录。例如:

var id = 23;
db.count('products',id).done(function(count) {
    if(count>0){
        db.get('products',id).done(function(r) {
            //Do something
        });
    }else{
        alert('No product found');
    }
});

当我尝试这个时,我收到以下错误:uncaught exception: null

非常感谢您的帮助谢谢!

1 个答案:

答案 0 :(得分:1)

您的解决方案几乎是正确的。

在IndexedDB API中,没有exists方法,可能是因为它可以使用count方法进行模拟。但是count方法只接受键范围,因此存在测试应该是:

var id = 23;
db.count('products', ydn.db.KeyRange.only(id)).done(function(cnt) {
  if (cnt) { // exist

  } else { // no exist

  }
}); 

另一个原因是,IndexedDB api中不存在exists方法,get不会为不存在的密钥提供错误。因此,您可以安全地,并建议:

var id = 23;
db.get('products', id).done(function(product) {
  if (product) { // exist

  } else { // no exist

  }
});

我想指出,在这两种检测存在的方法中,第一种方法更有效,因为它避免了反序列化。因此,如果您只需要测试是否存在,请使用第一种方法。要检索可能存在或不存在的记录,请使用第二种方法。

编辑:

按主键,ID或唯一辅助键查询记录,sku

/**
* @param {string} id id or sku
* @param {Function} cb callback to invoke resulting record value. If not exists in the
* database, null or undefined is returned.
*/
var getByIdOrSku = function(id, cb) {
  var req = db.get('items', id);
  req.done(function(item) {
    if (item) {
      cb(item) 
    } else {
      db.values('items', 'SKU', ydn.db.KeyRange.only(id), 1).done(function(items) {
        cb(items[0]); // may not have result
      });
    }
  }); 
};

如果您更喜欢承诺方式:

db.get('items', id).then(function(item) {
   if (item) {
      return item;
   } else {
      return db.values('items', 'SKU', ydn.db.KeyRange.only(id), 1).done(function(items) {
          return items[0];
      });
   }
}).done(function(item) {
   // result query as as id or SKU
   console.log(item);
});