Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

greendao string primary keys - how to use

In the greendao FAQs it says "Starting from greenDAO there’s limited support for String primary keys." http://greendao-orm.com/documentation/technical-faq/

I can't find anywhere that says how to do this.

I am using Guids as my primary key in a server application, and want to be able to generate new data remotely from an android device and upload this back to the server. The database on the android device is in sqlite and uses greenDAO to generate POJOs and data access layer. I am using Guids to avoid primary key collisions when data is uploaded to the server. I am storing the Guids as strings.

There is some more advice on the greendao website that says I should create a secondary field holding the string and still use the long primary key favoured by greendao, but this means that I have to reconnect all my database relationships when I import data from the server to the app which is a pain. Would much rather just continue to use the string primary keys if that is possible.

Can anybody tell me how to do this?

Here is some example code...

In my generator (I've removed most of the fields for clarity):

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;
}

In my android application I download all the data from the server. It has relationships based on the GUID id's. I have to reattach these to the int Id's I created in the generator like this:

            //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
                        }
                    }
                }
            }

So I end up having two sets of Id's linking everything, the int one for greendao and the string (guid) one that will work when it gets uploaded back to the server. Must be an easier way!

like image 302
BobbyG Avatar asked Nov 20 '13 11:11

BobbyG


1 Answers

Try this:

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;
}

I don't know if the ToOne-Mapping will work with strings, though. If it doesn't you can add some methods for getting the related objects in the KEEP-SECTIONS.

like image 161
AlexS Avatar answered Nov 01 '22 16:11

AlexS