あなたの解決策はほぼ正しいです。
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
}
});
exists
IndexedDB 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);
});