Неизменяемые объекты возврата chrome sqlite

Я использую 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);
    });
}

Это возвращает мне объект с данным идентификатором, все столбцы предоставляются как свойства. Ницца. Проблема, которую я только что выяснил, заключается в том, что все свойства объекта набора результатов неизменяемы. Так, например, если я хочу изменить свойство "title", это не имеет никакого эффекта, что, на мой взгляд, не имеет смысла. Пример:

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

}

Я, конечно, могу преобразовать все мои объекты БД в изменяемые объекты, но я бы этого не сделал.

Это ожидаемое поведение? Могу ли я запросить изменяемые объекты?

Я использую google chrome 9.0 в Mac OS X.

Ответ 1

Спецификация WebSQL не требует для возвращаемого элемента, который должен быть запечатан, но это до реализации (спецификация требует, чтобы элемент был упорядоченным словарем со свойствами в том же порядке, что и столбцы в вашем запросе).

И нет, нет способа явно запросить изменяемый объект, поэтому вы захотите сделать что-то вроде подхода convert_to_mutable(), предложенного Стэном.

Кстати, если вы используете стороннюю библиотеку, у нее, вероятно, есть функция для этого, например jQuery.extend() или _. extend().

Ответ 2

Основываясь на ответах Степана, но для таких людей, как я, которые хотят быстро исправить из 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 мне удалось сразу обновить свойства возвращаемого объекта строки.