2011-02-23 65 views
10

我正在使用一个SQLite DB作为一个Web应用程序的存储系统。我一直在使用直接在应用程序中从查询返回的对象。例如:不可变的铬sqlite返回对象

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

} 

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

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

我使用谷歌浏览器9.0在Mac OS X

+1

我做这个作为一种解决方法: 功能convert_to_mutable(result_object) { \t VAR可变=新的对象(); \t for(var key in result_object){mutable [key] = result_object [key]}; \t return \t mutable; } – 2011-02-23 17:26:12

+0

你能展示你如何创建数据库或链接到它的文档? – Havvy 2013-12-18 01:56:30

+0

我这样做:https://github.com/whoisstan/hyper_books/blob/master/js/book_storage.js - 项目的目标是编写一个基于html5的电子书阅读器,用于版权书籍,我没有花费我应该在过去的几年里花很多时间。 – 2013-12-18 14:08:41

回答

5

WebSQL spec要求为返回的项目将被密封,但它是由实现(规范确实需要的项目成为一个有序的字典,其属性与查询中的列的顺序相同)。

不,没有办法显式地请求一个可变对象,所以你会想要做一些像Stan建议的convert_to_mutable()方法。

顺便说一句,假设你使用的是第三方库,它可能有这个功能,例如jQuery.extend()_.extend()

+1

我结束了使用它。我想知道这或多或少有效。 newData = JSON.parse(JSON。stringify(resultData)); – 2015-02-17 23:33:19

0

建立在斯捷潘的答案上,但对于像我这样想从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的工具包浏览器我能够直接更新返回的行对象的属性。