greendao字符串主键 - 如何使用

时间:2013-11-20 11:42:56

标签: android orm greendao

在greendao常见问题解答中,它说“从greenDAO开始,对String主键的支持有限。” http://greendao-orm.com/documentation/technical-faq/

我找不到任何说明如何做的事。

我使用Guids作为服务器应用程序中的主键,并希望能够从Android设备远程生成新数据并将其上传回服务器。 android设备上的数据库是sqlite,使用greenDAO生成POJO和数据访问层。当数据上传到服务器时,我使用Guids来避免主键冲突。我将Guids存储为字符串。

在greendao网站上有一些建议说我应该创建一个包含字符串的辅助字段,并仍然使用greendao所支持的长主键,但这意味着我必须在导入数据时重新连接所有数据库关系从服务器到应用程序这是一个痛苦。如果可能的话,更愿意继续使用字符串主键。

有人能告诉我怎么做吗?

以下是一些示例代码......

在我的生成器中(为了清楚起见,我删除了大部分字段):

private static void addTables(Schema schema) 
{
    Entity unit = addUnit(schema);     
    Entity forSale = addForSale(schema);

    Property unitIntId = forSale.addLongProperty("unitIntId").getProperty();
    forSale.addToOne(unit, unitIntId);
}


private static Entity addForSale(Schema schema) 
{
    Entity thisEntity = schema.addEntity("ForSale");
    thisEntity.addIdProperty();
    thisEntity.addStringProperty("forSaleId");        
    thisEntity.addFloatProperty("currentPriceSqFt");        
    thisEntity.addStringProperty("unitId");
    return thisEntity;
}

private static Entity addUnit(Schema schema) 
{
    Entity thisEntity = schema.addEntity("Unit");
    thisEntity.addIdProperty();
    thisEntity.addStringProperty("unitId");
    thisEntity.addStringProperty("name");
    return thisEntity;
}

在我的Android应用程序中,我从服务器下载所有数据。它具有基于GUID id的关系。我必须将这些重新附加到我在生成器中创建的int Id中,如下所示:

            //Add relations based on GUID relations

            //ForSale:Units
            for(ForSale forSale:Globals.getInstance().forSales) 
            {
                if (forSale.getUnitId() != null && forSale.getUnit() == null)
                {
                    for(Unit unit:Globals.getInstance().units)
                    {
                        if (forSale.getUnitId().equals(unit.getUnitId()))
                        {
                            forSale.setUnit(unit);
                            break; //only need the first one
                        }
                    }
                }
            }

所以我最终有两组Id连接所有东西,一个用于greendao,另一个用于字符串(guid),当它被上传回服务器时将起作用。必须是一种更简单的方法!

1 个答案:

答案 0 :(得分:11)

试试这个:

private static void addTables(Schema schema) {
    Entity unit = addUnit(schema);     
    Entity forSale = addForSale(schema);

    Property unitId = forSale.addStringProperty("unitId").getProperty();
    forSale.addToOne(unit, unitId);
}

private static Entity addForSale(Schema schema) {
    Entity thisEntity = schema.addEntity("ForSale");
    thisEntity.addStringProperty("forSaleId").primaryKey();        
    thisEntity.addFloatProperty("currentPriceSqFt");        
    return thisEntity;
}

private static Entity addUnit(Schema schema) {
    Entity thisEntity = schema.addEntity("Unit");
    thisEntity.addStringProperty("unitId").primaryKey();
    thisEntity.addStringProperty("name");
    return thisEntity;
}

我不知道ToOne-Mapping是否可以使用字符串。如果没有,您可以添加一些方法来获取KEEP-SECTIONS中的相关对象。