IndexedDB で一番上の 1 行だけを取得する方法はありますか? 何も見つかりませんでした。
5 に答える
カーソルを使用して .continue() を呼び出さないことは、まったくハックではありません。意図した方法です。カーソルの主なポイントの 1 つは、必要な情報だけを取得できることです。
したがって、 transaction.abort() を呼び出す必要はありません
一種のハックですが、結果オブジェクトで continue() を呼び出さないと、最初のアイテムのみが処理されると思います。
以下は、カーソルを使用してクエリを実行し、1 つの結果のみを処理する簡単な例です。
var db = _IndexedDatabase;
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY);
var store = trans.objectStore("Sites");
var request = store.openCursor();
request.onsuccess = function (e)
{
var result = e.target.result;
if(!!result == false) { return; }
// Use result.value some how
// Comment out this line to process the first item only
//result.continue();
};
Transaction.abort() を使用できます
たとえば、@Shawnの例を使用する場合
var db = _IndexedDatabase;
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY);
trans.onabort = function(event) {
console.log(event);
};
var store = trans.objectStore("Sites");
var request = store.openCursor();
request.onsuccess = function (ev)
{
var cursor = request.result || ev.target.result;
if(!!cursor == false)
return;
console.log(cursor.value);
try{
transaction.abort();
}catch(e){
console.log(e);
}
};
インデックスに対して Get メソッドを使用するだけです。これは、指定されたキーの最初のレコードを返します。唯一の欠点は、ソートできないことです。
私は何も見つけられなかったので、これは私が今設置したものであり、私の目的にはうまく機能します. これはハックであり、私は満足していませんが、今のところ、これで十分です。
そのデータベースに必要な行を1つだけ保存しています。そして読み取り時に、すべての行を取得し、必要なアクションを実行します。これは 1 行だけです。新しい行を挿入するときは、データベース全体をクリアするだけです。これも 1 行だけで、新しい行が挿入されます。
@spiderdevil、私はあなたの答えを見たばかりで、トランザクションを中止できるかどうかわかりませんが、それが他の誰かにとって確実に機能する場合は、コメントで共有してください.