неизменяемые возвращаемые объекты Chrome SQLite - PullRequest
10 голосов
/ 23 февраля 2011

Я использую sqlite DB в качестве системы хранения для веб-приложения. Я использовал объекты, которые возвращаются из запросов непосредственно в приложении. Например:

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.

Ответы [ 2 ]

5 голосов
/ 06 марта 2014

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

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

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

0 голосов
/ 13 ноября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...