小编Jos*_*osh的帖子

对indexedDB查询的结果进行排序

我想对从indexedDB获得的结果进行排序.
每条记录都有{id,text,date}结构,其中'id'是keyPath.

我想按日期对结果进行排序.

我目前的代码如下:

  var trans = db.transaction(['msgs'], IDBTransaction.READ);
  var store = trans.objectStore('msgs');

  // Get everything in the store;
  var keyRange = IDBKeyRange.lowerBound("");
  var cursorRequest = store.openCursor(keyRange);

  cursorRequest.onsuccess = function(e) {
    var result = e.target.result;
    if(!!result == false){
        return;
    }
    console.log(result.value);
    result.continue();
  };
Run Code Online (Sandbox Code Playgroud)

javascript indexeddb

10
推荐指数
3
解决办法
1万
查看次数

如何使用户能够有效地将indexedDB对象存储的内容保存到文件中?

我在IndexedDB中存储了大量的小对象.我想让用户能够将其中一个对象存储导出到可以"下载"的文件中.

我读过这篇博客文章.其中介绍了读取数据,JSON.stringify对数据进行编码encodeURIComponent以及将其作为href可用于下载数据的链接.像这样的东西:

var transaction = db.transaction([objectstore], "readonly");
var content = [];
var objectStore = transaction.objectStore(objectstore);

objectStore.openCursor().onsuccess = function(event) {
    var cursor = event.target.result;
    if (cursor) {
        content.push({key:cursor.key,value:cursor.value});
        cursor.continue();
    }
}; 

transaction.oncomplete = function(event) {
    var serializedData = JSON.stringify(dataToStore);
    link.attr("href",'data:Application/octet-stream,'+encodeURIComponent(serializedData));
    link.trigger("click");
};
Run Code Online (Sandbox Code Playgroud)

这很好,除了对象存储将有数百万条记录,我不觉得这将足够高性能.有没有办法更直接地允许用户将对象存储作为文件保存(以我可以通过网页再次导入的方式).


编辑从评论中的一些注释我重写了一些如何工作,以便从中获得更多的果汁.新代码类似于:

var transaction = db.transaction([objectstore], "readonly");
var objectStore = transaction.objectStore(objectstore);

objectStore.getAll().onsuccess = function(evt) {
    var url = window.URL.createObjectURL(new Blob(evt.target.results, {'type': 'application/octet-stream'}));
    link.attr('href', url);
    link.trigger('click');
};
Run Code Online (Sandbox Code Playgroud)

哪个会给我结果如下:

  • 10k记录,平均出口时间975.87ms
  • 100k记录,平均出口时间为5,850.10ms
  • 1mil记录,平均出口时间56,681.00ms …

javascript html5 indexeddb

10
推荐指数
1
解决办法
3225
查看次数

如何同步访问indexedDB?

indexedDB有一个规范说您可以同步访问索引数据库,但尚未实现.

我只是想知道是否有办法让它手动同步,

我的JavaScript看起来像这样,

var trans = databaseAsync.transaction(["mapTile"], IDBTransaction.READ_WRITE);
var store = trans.objectStore("mapTile");
var keyRange = IDBKeyRange.bound(evt.data[0], evt.data[0]);
var cursorRequest = store.openCursor(keyRange);

// can you put some kind of wait in here?

cursorRequest.onsuccess = function(e)
{
    var result = e.target.result;
    if(!!result == false)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以在那里放一些东西让它等到onsuccess方法被调用后再继续吗?

我想这样做的原因是上面的代码包含在这个方法中,

dojo.extend(esri.layers.ArcGISTiledMapServiceLayer, {
      getTileUrl : function(level, row, col)
      {
          // blah
          return url;
      }
Run Code Online (Sandbox Code Playgroud)

所以它是一个ESRI图块层(它会将图块加载到我的网页上的地图上),并且该方法需要立即返回特定图块的网址.它将是一个加载图像的URL,如果它没有缓存在数据库中,或者这个,

data:image;base64,*BASE64DATA*
Run Code Online (Sandbox Code Playgroud)

其中BASE64DATA是以前缓存的数据库中的数据.

我之前使用的是localStorage,它同步工作,但是有5MB的限制,所以我想我会尝试使用indexedDB.

javascript indexeddb

9
推荐指数
1
解决办法
7122
查看次数

如何更新indexedDB中的数据?

我试图从W3C获取有关indexedDB数据库中objectStore项的更新的一些信息,但没有那么多的可疑.我在这里找到一种方法,但它对我来说并不适用.

我的实现是这样的

DBM.activitati.edit = function(id, obj, callback){
    var transaction = DBM.db.transaction(["activitati"], IDBTransaction.READ_WRITE);
    var objectStore = transaction.objectStore("activitati");
    var keyRange = IDBKeyRange.only(id);

    objCursor = objectStore.openCursor(keyRange);
    objCursor.onsuccess = function(e){
        var cursor = e.target.result;
        console.log(obj);
        var request = cursor.update(obj);
        request.onsuccess = function(){
            callback();
        }
        request.onerror = function(e){
            conosole.log("DBM.activitati.edit -> error " + e);
        }

    }   
    objCursor.onerror = function(e){
        conosole.log("DBM.activitati.edit -> error " + e);
    }                   
}
Run Code Online (Sandbox Code Playgroud)

我有所有DBM.activitati.(添加|删除| getAll | getById | getByIndex)方法工作,但我无法解决这个问题.

如果您知道我如何管理它,请告诉我们!

谢谢!

javascript html5 indexeddb

9
推荐指数
2
解决办法
3万
查看次数

计算indexedDB中对象库中的记录数

我想基本计算indexedDB数据库中的记录数.

目前我的代码看起来像

使用Javascript

var transaction = db.transaction(["data"], "readonly");
var objectStore = transaction.objectStore("data");
var cursor = objectStore.openCursor();  
    var count = objectStore.count();
    console.log(count); 
Run Code Online (Sandbox Code Playgroud)

我希望这能说输出只有3,但我得到了.

产量

        IDBRequest {onerror: null, onsuccess: null, readyState: "pending", transaction: IDBTransaction, source: IDBObjectStore…}
    error: null
    onerror: null
    onsuccess: null
    readyState: "done"
    result: 3
    source: IDBObjectStore

transaction: IDBTransaction
__proto__: IDBRequest
Run Code Online (Sandbox Code Playgroud)

这是正确的,但我只是想说它不是其他东西.

javascript indexeddb

9
推荐指数
3
解决办法
7370
查看次数

在Firefox中打开IndexedDB时出现InvalidStateError

在Firefox 17.0.1中,当我尝试打开IndexedDB数据库时,Firebug控制台向我显示InvalidStateError异常.此外request.onerror事件引发,但event.target.errorCode不确定的.

if (window.indexedDB) {
    var request = window.indexedDB.open('demo', 1);
    request.onsuccess = function(event) {
        // not raised
    };
    request.onupgradeneeded = function(event) {
        // not raised
    };
    request.onerror = function(event) {
        // raised with InvalidStateError
    };
}
Run Code Online (Sandbox Code Playgroud)

有没有人在Fi​​refox中有过IndexedDB的经验?

更新

Firefox 18.0.1具有相同的行为.Comlete来源.

javascript firefox indexeddb

8
推荐指数
1
解决办法
3435
查看次数

IE是否支持indexedDB,WebSQL或类似于SQLite的数据库?

对于Chrome,我可以使用IndexedDB和WebSQL,对于Firefox,我可以使用IndexedDB,IE呢?我开发了一个使用WebSQL的应用程序,它可以在桌面Chrome和Safari,iOS Safari和Android浏览器上正常运行.接下来,我想将它移植到Desktop Firefox和IE.我正在考虑使用IndexedDB,但发现IE并不真正支持它.我有什么选择?

sqlite internet-explorer web-sql indexeddb

7
推荐指数
1
解决办法
1万
查看次数

在IE 10中使用复合键创建索引时出现DataError

我正在使用IE10测试基于indexedDB的应用程序.我无法创建具有多个键的对象库.例如,var objectStore = theDb.createObjectStore("store1", { keyPath: ["key1","key2"] });.

当我尝试将数据插入到存储中时,会引发异常消息:"DataError"这不是很有用!有没有人能够objectStores使用IE10 创建多个键?这可以在Chrome中进行精细测试.

javascript indexeddb

7
推荐指数
1
解决办法
2174
查看次数

适当的事件日志解析器设计模式?

处理解析事件日志的项目,然后根据这些事件的属性更新模型.我一直懒得"完成它",更关心前期优化,精益代码和适当的设计模式.主要是自学实验.我感兴趣的是更有经验的设计师认为相关的模式,或者哪种类型的伪编码对象架构是最好的,最容易维护的等等.

单个日志中可以有500,000个事件,大约有60种类型的事件,所有这些事件共享大约7个基本属性,然后根据事件类型具有0到15个其他属性.事件类型是每行日志文件中的第二个属性.

因此,我尝试了一个非常丑陋的命令式解析器,逐行遍历日志,然后逐行处理事件.然后我尝试了一个使用"nextEvent"模式的词法规范,该模式在循环中被调用并被处理.然后我尝试了一个简单的旧"解析"方法,该方法永远不会返回,只是将事件触发到已注册的侦听器回调.无论事件类型如何,我都尝试过一次回调,以及特定于每种事件类型的回调方法.

我已经尝试了一个基础"事件"类,其中包含所有可能属性的并集.我试图避免"新事件"调用(因为可能存在大量事件并且事件对象通常是短暂的)并且每种类型的回调方法都具有原始属性参数.我已经尝试为60个事件类型中的每一个创建一个子类,并使用具有7个公共基本属性的抽象事件父类.

我最近尝试进一步使用命令模式为每个事件类型放置事件处理代码.我不确定我是否喜欢这个并且它与每种类型的回调方法非常相似,只是代码在类型子类中的执行函数内,而不是每种类型的回调方法.

问题是很多模型更新逻辑是共享的,而且很多都是特定于子类的,我只是开始对整个事情感到困惑.我希望有人能够至少指出我的方向来考虑!

java logging

6
推荐指数
1
解决办法
2850
查看次数

如何检查indexedDB实例是否打开?

假设我有一个 indexedDB 对象的实例。有没有一种简单的方法来检测对象当前是否处于“打开”状态?

我尝试过database.closePending查看其他属性,但没有看到一个简单的属性可以告诉我数据库的状态。

  • 我希望同步执行此操作。
  • 尝试在数据库上打开事务并检查是否发生异常之类的事情对我来说不是一个合理的解决方案。
  • 我不想维护与数据库实例关联的额外变量。

也许我缺少 api 中的一些简单功能?实例变量是否有一些可观察的特征,我可以快速轻松地查询以确定状态?

换句话说,您可以改进以下实现吗?

function isOpen(db) {
  if(db && Object.prototype.toString.call(db) === '[object IDBDatabase]') {
    var names = db.objectStoreNames();
    if(names && names.length) {
      try {
        var transaction = db.transaction(names[0]);
        transaction.abort();
        return true;
      } catch(error) {
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

还是这个方法?

var opened = false;
var db;
var request = indexedDB.open(...);
request.onsuccess = function() {
  db = request.result;
  opened = true;
};

function isOpen(db) {
  return opened;
}

db.close();
opened = false;
Run Code Online (Sandbox Code Playgroud)

还是这个方法? …

javascript indexeddb

6
推荐指数
1
解决办法
4122
查看次数