2012-01-19 131 views
3

我在我的應用程序引擎數據存儲中有一個實體。實際上只有一個實體。我可以在我的管理控制檯中看到它。是否可以通過管理控制檯(使用gql)向實體添加新屬性?將新屬性添加到數據存儲中的實體?

現在它看起來像:

Entity: Foo 
Attributes: mName, mAge, mScore 

,我想一個新的布爾屬性添加到這個實體,如「mGraduated」或類似的東西。

在最壞的情況下,我可以寫一些代碼來刪除實體然後保存一個新的,但是,是隻是想知道。

感謝

-------- ---------更新

試圖從數據庫中添加我的新屬性添加到我的類(使用Java),並在加載得到如下:

java.lang.NullPointerException: 
    Datastore entity with kind Foo and key Foo(\"Foo\") has a null property named mGraduated. 
    This property is mapped to com.me.types.Foo.mGraduated, which cannot accept null values. 

這是我的實體類是什麼樣子,我剛剛添加的新屬性(mGraduated),再部署,再試圖從數據庫加載單個實體(其產生上述除外):

@PersistenceCapable 
public class Foo 
{ 
    @PrimaryKey 
    private String k; 

    /** Some old attributes, look like the following. */ 
    @Persistent 
    @Extension(vendorName = "datanucleus", key = "gae.unindexed", value="true") 
    private String mName; 

    ... 

    /** Tried adding the new one. */ 
    @Persistent 
    @Extension(vendorName = "datanucleus", key = "gae.unindexed", value="true") 
    private boolean mGraduated; 

回答

1

你無法通過管理控制檯做到這一點,但你不應該刪除的實體。相反,只需更新它 - 數據存儲不會強制Kinds的模式。例如,如果Foo是db.Model(Python)的子類,則更改您的模型子類以包含新屬性;獲取模型實例(例如,通過其關鍵字),更新實例,包括設置新字段的值;並保存修改的實例。既然你只有一個實例,這很容易。有很多這樣的實例更新,你可能想通過任務隊列任務或通過mapreduce作業來做到這一點。

+0

嗨,是的,我認爲我記得在過去曾經這樣做過,但是現在當我用新定義加載時,它似乎正在拋出異常。更新了上面的問題並提供了更多詳細信息,看起來好嗎?謝謝 – user291701

0

您已經使用基本布爾型,它不能爲空宣佈新mGraduated領域。現有實體無法加載到模型類中,因爲它沒有此屬性。一種選擇是使用可接受空值的布爾類聲明此屬性。

管理控制檯只知道現有實體中的屬性。您不能直接使用管理控制檯創建名稱未由任何現有實體使用的新屬性。 (這只是一個控制檯。應用程序代碼可以做到這一點的限制很容易。)

+0

丹,這很有道理 - 但是如果我真的想添加一個原始布爾類型,那麼過程是什麼?這是不可能的,我們必須使用盒裝布爾類型嗎?謝謝 – user291701

+0

如果可能存在沒有設置屬性的實體,則必須使用裝箱類型。 JDO/JPA無法表示「未設置」,因此它將值填充爲「null」,該值無法分配給基本類型。 –

2

來實現這一點的唯一方法是使用布爾作爲新屬性的類型..

比一套方法,你可以接受布爾值,這沒有問題。

如果你想get方法也返回布爾..你也可以,但一定要檢查,如果該值爲null如果是這樣..返回默認值(例如真)

所以

private Boolean newProp = null; // can also assing default value .. e.g. true; 

public void setNewProp(boolean val) 
{ 
    this.newProp = val; 
} 

public boolean getNewProp() 
{ 
    if(this.newProp == null) 
     return true; // Default value if not set 

    return this.newProp.booleanValue(); 

} 

,我建議你不要遷移數據在這種情況下 - 它可以是非常昂貴的,可以很容易地消耗自己的配額(讀取舊數據,創建新的,刪除舊= 3個操作對於你的數據存儲中的每一個條目)

相關問題