Javascript 打开数据库时PhoneGap Windows Phone 8 IndexedDB异常

Javascript 打开数据库时PhoneGap Windows Phone 8 IndexedDB异常,javascript,cordova,windows-phone-8,indexeddb,Javascript,Cordova,Windows Phone 8,Indexeddb,基本上使用来自的示例,我可以看到我的testindexeddb代码在Chrome上工作。当我将应用程序加载到deviceready处理程序内的Windows Phone 8设备上时,我在数据库打开请求的错误处理程序中得到一个abortorror 另一个相关的SO问题是通过修复onupgradeneeded中的错误解决的,但在我的代码中从未调用过这个处理程序 在这个简单的示例中,您必须运行小提琴两次,因为显然在onupgradeneeded之前调用了onsuccess(其中我读取了测试值)(在初始

基本上使用来自的示例,我可以看到我的testindexeddb代码在Chrome上工作。当我将应用程序加载到
deviceready
处理程序内的Windows Phone 8设备上时,我在数据库打开请求的错误处理程序中得到一个
abortorror

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

在这个简单的示例中,您必须运行小提琴两次,因为显然在
onupgradeneeded
之前调用了
onsuccess
(其中我读取了测试值)(在初始化db时写入了值)。一旦我第一次测试成功,我就要处理这个问题

问题:

  • 我犯了什么愚蠢的错误
  • 是否有IndexedDb和PhoneGap的Windows Phone 8示例?我找了半天也找不到。IndexedDb API Android和IOS polyfill有一些,但wp8没有
  • 因为我在打电话,我有什么特别的事要做吗?同样,该代码在chrome中工作
  • 是否有其他插件支持wp8存储>5mb?
    • LocalStorage的大小限制为5mb
    • 不支持WebSQL
    • 文件系统插件不支持filewriter.write(blob)。这就是我在Android/iOS上使用的。奇怪的是,他们说这个插件支持wp8,而这是实际写入数据的唯一方法,而你不能读取你能写的东西。我发现,尽管web api不支持它,但设备支持
      filewriter.write(string)
      。WindowsPhone8仍然没有完全正确地写/读东西,但这是一个单独的问题

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

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

    最近,我在索引数据库方面遇到了类似的问题。我的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");
    };
    

    })

    IDB应该可以存储超过5mb的数据。Cordova确实支持WP8中的IDB,所以我对您的问题很好奇。您的协议、域和端口元组是什么?我想知道您是否遇到了安全异常,例如关闭
    文件://
    我认为它使用的是
    文件://
    ,因为我的所有web资产都在磁盘上,并用PhoneGap/Cordova包装。如果抛出的错误有除“abortorror”以外的任何描述,这会有所帮助,但不幸的是,这就是我必须处理的全部内容。如果是与安全相关的,我预计会出现更好的错误,但这肯定是可能的。
    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");
    };