1

特定の 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

本当にありがとうございました。

4

1 に答える 1

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

  }
}); 

existsIndexedDB api にメソッドが存在しないもう 1 つの理由は、存在しgetないキーに対してエラーを出さないためです。したがって、次のことを安全に行うことができ、推奨されます。

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

  } else { // no exist

  }
});

存在を検出するこれらの 2 つの方法では、最初の方法が逆シリアル化を回避できるため、より効率的であることを指摘したいと思います。したがって、存在をテストする必要がある場合は、最初の方法を使用してください。存在する場合と存在しない場合があるレコードを取得するには、2 番目の方法を使用します。

編集:

プライマリ キー、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);
});
于 2013-10-06T01:27:16.750 に答える