2012-01-19 190 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个操作对于你的数据存储中的每一个条目)

相关问题