打开db时PhoneGap Windows Phone 8 IndexedDB AbortError

时间:2014-05-14 15:55:17

标签: javascript cordova windows-phone-8 indexeddb

基本上使用MDN IndexedDb tutorial中的示例我可以看到我的测试IndexedDb代码正在Chrome上运行。当我将应用程序加载到deviceready处理程序内的Windows Phone 8设备上时,我在数据库打开请求的错误处理程序中得到AbortError

通过修复onupgradeneeded中的错误解决了唯一的其他相关SO问题,但我的代码中甚至都没有调用此处理程序。

在这个简单的例子中,你必须运行两次小提琴,因为在onsuccess之前调用了onupgradeneeded(在那里我读了一个测试值)(我在db初始化时写了值) 。一旦我完成了第一次测试,我就会处理这个问题。

http://jsfiddle.net/WDUVx/2/

// In the following line, you should include the prefixes of
// implementations you want to test.
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;

if (!window.indexedDB) {
  window.alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.");
}

// open the database
var db;
var request = window.indexedDB.open("MyTestDatabase", 1);

request.onerror = function(e) {
  alert("Couldn't open database: " + kc.util.getObjectString(e.target));
};

request.onsuccess = function(e) {
  db = e.target.result;
  var getRequest = 
   db.transaction("data")
  .objectStore("data")
  .get("firstObject")
  .onsuccess = function(event) {
    alert("Got: " + event.target.result.test);
  };
};

request.onupgradeneeded = function(e) {
  var db = event.target.result;
  var objectStore = db.createObjectStore("data", {
    autoincrement : false
  });

  objectStore.transaction.oncomplete = function(event) {
    var myObjectStore = db.transaction("data", "readwrite").objectStore("data");
    var addRequest = myObjectStore.add({
      test : true
      }, 
      "firstObject");

    addRequest.onerror = function(e) {
      console.log("Error adding");
    };

    addRequest.onsuccess = function(e) {
      console.log("Added!");
    };
  };
};

问题:

  1. 我的愚蠢错误是什么?
  2. 是否有任何Windows Phone 8的IndexedDb和PhoneGap示例?经过一番搜索,我找不到任何东西。 IndexedDb API Android和IOS polyfill有一些,但wp8没有。
  3. 我有什么特别的东西要做,因为我在打电话吗?同样,代码在chrome中工作。
  4. 是否还有其他支持wp8存储的插件> 5MB?
    • LocalStorage的大小限制为5mb
    • 不支持WebSQL
    • FileSystem插件不支持filewriter.write(blob)。这就是我在Android / iOS上使用的内容。奇怪的是,当这是实际写入数据的唯一方法时,他们说这个插件支持wp8,你无法读取你可以写的任何内容我发现虽然web api不支持,但设备支持 filewriter.write(string) Windows Phone 8仍然没有完全正确地编写/阅读内容,但这是一个单独的问题。

2 个答案:

答案 0 :(得分:1)

最近,我遇到了索引数据库的类似问题。我的IndexedDB.open请求抛出了一个中止错误。

  • 在做了一些搜索之后,我找到了分离数据库创建和存储创建请求的建议。
  • 分隔代码可防止中止错误。但是,我注意到创建存储的事务有时甚至在完成数据库创建请求之前就已运行。
  • 这意味着当第二个请求运行时,我的数据库连接没有从第一个请求关闭。
  • 需要一个小修复才能克服此错误。我移动代码为第一次调用成功事件创建商店。

以下是供参考的代码。

function create_db(db_name)
{
    var request = indexedDB.open(db_name);

request.onupgradeneeded=function(e)
{
     console.log("1. creating database");
     db=e.target.result;
 };

 request.onsuccess = function(e) 
 {
     db = e.target.result;
     console.log("1.1 database created successfully");
     db.close();
     add_tables(db_name);
 };

request.onerror=function(e)
 {
     alert("error: "+ e.target.error.name + "failed creating db");
     console.log("1.2 error creating db");
 }; 
}

function add_tables(db_name)
{
     var request = indexedDB.open(db_name,2);

     request.onsuccess=function(e)
 {
     db=e.target.result;
     console.log("2.2 table creation request successful");
 };

 request.onupgradeneeded=function(e)
 {
    db=e.target.result;

    table = db.createObjectStore("table_name");
    table.createIndex("id","id");       
    console.log("2.2 creating a single object store");
 };

request.onerror=function(e)
{
    console.log("2.3 error occured when creating tables");
};

};

答案 1 :(得分:0)

只是一些想法,希望他们帮助:

  • 不要使用全局db变量。在回调中完成所有工作。使用全局db变量可能会导致许多无法解释的情况,其中一些包括中止错误。看看你的代码,看起来你实际上只是使用e.target,所以我不确定为什么你有一个全局var db。
  • 不要对onupgradeneeded回调中发生的版本更改事务执行读/写请求。相反,在适当的时候执行请求,让indexeddb担心调用onupgradeneeded。换句话说,不要在onupgradeneeded中检索事务。相反,只需在新连接中启动一些稍后的事务,就像onupgradeneeded回调已经完成一样。
  • 具有中止事件的openDBRequest在onupgradeneeded回调之前
  • 除非您尝试使用更高版本连接到数据库,否则不会调用
  • onupgradeneeded
  • 听取中止事件。为onabort的open database请求添加回调。中止事件有时会发生,例如在尝试访问同一数据库的同一上下文中打开两个页面。那里可能会有一些时髦的东西。