PhoneGap Windows Phone 8 IndexedDB AbortError when opening d

PhoneGap Windows Phone 8 IndexedDB AbortError when opening db

本文关键字:when opening AbortError IndexedDB Windows Phone PhoneGap      更新时间:2023-09-26

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

唯一其他相关的SO问题是通过修复onupgradeneeded中的错误来解决的,但这个处理程序甚至从未在我的代码中调用。

在这个简单的示例中,您必须运行两次,因为显然onsuccessonupgradeneeded(在初始化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. 有没有任何Windows Phone 8的IndexedDb和PhoneGap的例子?我找了一会儿也找不到。有一些用于IndexedDb API的Android和IOS polyfill,但没有用于wp8。
  2. 有什么特别的事情我必须做,因为我在打电话吗?同样,代码在chrome中工作。
  3. 是否有其他插件支持wp8存储> 5mb?
    • LocalStorage有5mb的大小限制
    • 不支持WebSQL
    • 文件系统插件不支持filewriter.write(blob)这就是我在Android/iOS上使用的方法。奇怪的是,他们说wp8支持这个插件,当这是实际写入数据的唯一方式,你不能读取你可以写的东西。我发现虽然web api不支持它,但设备支持 filewriter.write(string)Windows Phone 8仍然不能完全正确地写入/读取内容,但这是一个单独的问题。

最近,我在索引数据库中遇到了类似的问题。我的IndexedDB。打开的请求抛出了中止错误。

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

这是供参考的代码。

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");
};

};

只是一些想法,希望能有所帮助:

  • 不要使用全局db变量。在回调中完成所有的工作。使用全局db变量可能导致许多无法解释的情况,其中一些包括获得中止错误。看看你的代码,它实际上看起来像你只是正确地使用e.g target,所以我不知道为什么你有一个全局变量db。
  • 不要对onupgradenneeded回调中发生的版本变更事务执行读/写请求。相反,在适当的时候执行请求,让indexeddb担心调用onupgradenneeded。换句话说,不要在onupgradenenrequired中检索事务。相反,只需在新连接中启动一些稍后的事务,就好像onupgradenenrequired回调已经完成一样。
  • openDBRequest在onupgradeneed回调之前有一个abort事件
  • onupgradenneeded不会被调用,除非你尝试使用更高版本的
  • 连接到数据库。
  • 监听中止事件。为onabort的打开数据库请求添加回调。中断事件有时会发生,因为在同一上下文中打开两个试图访问同一数据库的页面。这里可能有什么特别的事情发生。