2011-02-23 67 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的工具包瀏覽器我能夠直接更新返回的行對象的屬性。