2013-11-20 5 views
6

In den FAQs zu greendao heißt es: "Ab greenDAO gibt es eingeschränkte Unterstützung für String-Primärschlüssel." http://greendao-orm.com/documentation/technical-faq/greundo string primary keys - wie man verwendet

Ich kann nirgendwo finden, wie dies zu tun ist.

Ich verwende Guids als meinen Primärschlüssel in einer Server-Anwendung und möchte in der Lage sein, neue Daten von einem Android-Gerät remote zu generieren und diese zurück auf den Server zu laden. Die Datenbank auf dem Android-Gerät befindet sich in sqlite und verwendet greenDAO zum Generieren von POJOs und Datenzugriffsschichten. Ich verwende Guids, um Primärschlüsselkollisionen zu vermeiden, wenn Daten auf den Server hochgeladen werden. Ich speichere die Guids als Strings.

Es gibt einige weitere Hinweise auf der greendao-Website, die besagt, dass ich ein sekundäres Feld erstellen soll, das die Zeichenfolge enthält und den von greundo bevorzugten langen Primärschlüssel verwendet, aber das bedeutet, dass ich beim Import alle meine Datenbankbeziehungen wiederherstellen muss Daten vom Server zur App, was ein Schmerz ist. Würde viel lieber nur die String-Primärschlüssel verwenden, wenn das möglich ist.

Kann jemand mir sagen, wie man das macht? Hier

ist einige Beispiel-Code ...

In meinem Generator (ich die meisten Felder aus Gründen der Klarheit entfernt haben):

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 meinem Android-Anwendung herunterladen ich alle Daten aus der Server. Es hat Beziehungen basierend auf der GUID-ID. Ich muß diese an denen ich in dem Generator wie folgt erstellt der int Id wieder anbringen:

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

ich mit zwei Sätzen von Id der Verknüpfung alles am Ende also der int eines für greendao und die Zeichenfolge (GUID) eine, die arbeiten, wenn es zurück auf den Server hochgeladen wird. Muss ein einfacher Weg sein!

+0

Haben Sie schon etwas probiert? – AlexS

+0

@AlexS - Ich habe oben einen Beispielcode hinzugefügt. Irgendwelche Ideen? – BobbyG

+0

Funktioniert das Mapping auch? – AlexS

Antwort

11

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

Ich weiß nicht, ob das TOONE-Mapping mit Streichern arbeiten, though. Wenn dies nicht der Fall ist, können Sie einige Methoden hinzufügen, um die zugehörigen Objekte in den KEEP-SECTIONS zu erhalten.

+1

Wunderbar! .primaryKey() war die Antwort. Das ToOne Mapping hat gut funktioniert. Ich habe auch ein Eins-zu-viele-Mapping ausprobiert, das auch richtig funktioniert (muss nur lang -> string an entsprechenden Stellen). Das hat mir Stunden gespart oder Code geschrieben. Weißt du zufällig, wo es ein umfassenderes Handbuch gibt, da ich nichts dazu finden konnte, tatsächlich deutete die Webseite an, dass du nur Longs benutzen könntest. Ich habe derzeit nur die Beispiele auf der Greendao-Website, um weiterzugehen. – BobbyG

+0

Großartig. Ich habe es vorher noch nicht versucht und war zu kurz, um es mir genauer anzusehen. Leider kenne ich kein anderes Handbuch für greundao. Einige nützliche Hinweise und Beispiele finden Sie in der Google-Gruppe greendao. Ich benutze natürlich auch das Javadoc. Glücklicherweise ist greundao OpenSource. Wenn Sie sich über ein bestimmtes Verhalten wundern, können Sie sich an den Quellen orientieren. Da greundao keine Reflektion verwendet, ist der Code ziemlich einfach. – AlexS

+0

Ich war genau in der gleichen Situation, die BobbyG (ich benutze UUID, um Primärschlüssel Kollisionen zwischen meiner Android-App und meiner Website zu vermeiden). Vielen Dank für Ihre Hilfe! Alles ist OK mit Primärschlüssel als String. – Guicara