2017-09-27 69 views
0
到datbase

我似乎無法弄清楚如何在數據庫中更新數據:保存數據Baqend

下面是代碼:

handleSubmit(event) { 
    event.preventDefault(); 
    var fulladdress = this.state.address1 +" "+ this.state.city +", "+ this.state.state +" "+ this.state.zip; 
    Geocoder.getFromLocation(fulladdress).then(
     json => { 
     var location = json.results[0].geometry.location; 
     //alert(location.lat + ", " + location.lng); 
     var geo = new db.GeoPoint(location.lat, location.lng) 
     var updatecompany = new db.Companies({ 
      id: '16747fce-f0b1-422b-aa60-220c2dccac58', 
      name: this.state.name, 
      logo: '', 
      photo: '', 
      address1: this.state.address1, 
      address2: this.state.address2, 
      city: this.state.city, 
      state: this.state.state, 
      zip: this.state.zip, 
      geo: geo, 
     }); 

     updatecompany.update().then(() => { 
      alert("company saved!") 
     }) 
     }, 
     error => { 
     alert(error); 
     } 
    ); 
    } 

在這個文件中,我希望更新公司資料的數據。首先,我們從Google Maps API獲取緯度/經度。

當我運行這個時,我得到這個錯誤:未處理的拒絕(EntityExistsError):實體/ db/Companies/16747fce-f0b1-422b-aa60-220c2dccac58由不同的db管理。

我試着刪除ID,但後來我得到這個錯誤:Unhandled Rejection(PersistentError):無法插入新的對象。

我需要使用鑰匙還是別的嗎?或者,ID是否傳遞到對象之外?

回答

1

如果你想修改現有的對象,你應該從數據庫中獲取現有的對象,然後修改它。這確保了覆蓋不會丟失更新。

db.Companies.load(id).then(company => { 
    company.name = this.state.name; 
    ... 
    return company.update(); 
}); 

或者,您可以只獲取託管數據庫對象應用您的更改並強制保存它。這將覆蓋任何現有的數據庫狀態並保存您的更改。

//This will get the current managed object for the Id 
//That object may not have loaded state 
company = db.Companies.ref(id); 
company.name = this.state.name; 
//The force overwrites any previously stored state 
//This may result in lost updates when the object is concurrently saved by different clients 
company.save({force: true}); 
+0

我想我明白你在這裏說什麼......只是爲了澄清:baqend只會更新我們傳遞的鍵/值?那麼在你的例子中,這隻會更新company.name?而且我也不應該傳遞空串,因爲我們只需要傳遞將要改變的內容。 –

+0

這工作得很好,我想你必須建立一個對象,然後以某種方式將它傳回baqend,這種方法要簡單得多! –

+0

如果您事先通過查找或加載調用加載對象,則ref僅返回此以前加載的對象。因此更新可以很容易地應用。 –