【问题标题】:immutable chrome sqlite return objects不可变的 chrome sqlite 返回对象
【发布时间】:2011-07-02 21:45:45
【问题描述】:

我使用 sqlite DB 作为 webapp 的存储系统。我一直在应用程序中直接使用从查询返回的对象。例如:

function get_book_by_id(id,successCallback,errorCallback)
{
    function _successCallback(transaction, results)
    {
        if(results.rows.length==0) {successCallback(null);}
        else
        {
            book=results.rows.item(0);
            successCallback(book);
        }
    }
    db.transaction(
        function (transaction) {
            transaction.executeSql("SELECT id,title,content,last_read from books where id=?;",[id], _successCallback, errorCallback);
    });
}

这将返回一个具有给定 id 的对象,所有列都作为属性提供。好的。我刚刚发现的问题是结果集对象的所有属性都是不可变的。因此,例如,如果我想更改属性“标题”,它不会生效,我认为这没有任何意义。示例:

get_book_by_id(1,handle,error);
function handle(book)
{
 //THIS DOESN'T WORK, book.title is still what it was.
 book.title=book.title+"more text";

}

我当然可以将所有数据库对象转换为可变对象,但我宁愿不这样做。

这是预期的行为吗?我可以请求可变对象吗?

我在 Mac OS X 上使用 google chrome 9.0。

【问题讨论】:

  • 我这样做是一种解决方法:function convert_to_mutable(result_object) { var mutable=new Object(); for(var key in result_object){mutable[key]=result_object[key]};返回可变; }
  • 你能说明你是如何创建数据库的或链接到它的文档吗?
  • 我在这里做到了:github.com/whoisstan/hyper_books/blob/master/js/book_storage.js - 该项目的目标是为无版权的书籍编写一个基于 html5 的电子书阅读器,过去几年我没有花太多时间在它上面,我应该.
  • Stan Wiechers,您是否尝试过 Object.defineProperty() 使您的结果可变。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript sqlite html google-chrome


【解决方案1】:

WebSQL spec要求将返回的项目密封,但这取决于实现(规范确实要求项目是具有属性的有序字典与查询中的列的顺序相同)。

不,没有办法显式请求可变对象,因此您需要执行 Stan 建议的 convert_to_mutable() 方法。

顺便说一句,假设您使用的是 3rd 方库,它可能具有此功能,例如 jQuery.extend()_.extend()

【讨论】:

  • 我最终使用了这个。我想知道这或多或少是有效的。 newData = JSON.parse(JSON.stringify(resultData));
【解决方案2】:

以 Stepan 的回答为基础,但对于像我这样希望从 SO 快速解决的人来说。
您可以创建另一个基本对象并将 sqlite 行属性复制到它上面。
像这样的:

var immutable_book = results.rows.item(0);
var book = {};
for (var prop in immutable_book) {
    if (immutable_book.hasOwnProperty(prop)) {
        book[prop] = immutable_book[prop];
    }
}

这在 _successCallback 中,稍后你可以这样做:

book.title=book.title+"more text"; // works now !

我在 iOS Safari 中遇到了这个问题,但在 Chrome 和 Android web-kit 浏览器中,我能够直接更新返回的行对象的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2020-04-24
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多