2013-11-20 6 views
6

greendaoのFAQでは、「greenDAOから始まり、文字列の主キーのサポートが限られています。 http://greendao-orm.com/documentation/technical-faq/greendaoの文字列の主キー - 使用方法

私はどのようにこれを行う方法を見つけることができません。

サーバーアプリケーションで主キーとしてGuidsを使用しています。アンドロイドデバイスから新しいデータをリモートで生成し、サーバーにアップロードできるようにしたいと考えています。アンドロイドデバイスのデータベースはsqliteにあり、greenDAOを使用してPOJOとデータアクセス層を生成します。私はデータがサーバーにアップロードされるとき、主キーの衝突を避けるためにGuidsを使用しています。私はGuidsを文字列として保存しています。

greendaoのウェブサイトには、文字列を保持する2次フィールドを作成し、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; 
} 

私はすべてのデータをダウンロードしますサーバ。それはGUIDのIDに基づいて関係を持っています。私は、IDの私はこのような発電機で作成されたintにこれらを再接続する必要があります。

  //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と文字列のint型1(GUID)意志1の2セットを持って終了しますそれがサーバーにアップロードされると動作します。簡単な方法でなければならない!

+0

既に試しましたか? – AlexS

+0

@AlexS - 上記のサンプルコードをいくつか追加しました。何か案は? – BobbyG

+0

マッピングも同様に機能しますか? – AlexS

答えて

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

トゥーンマッピングはしかし、文字列で動作するかどうか、私は知りません。そうでなければ、KEEP-SECTIONSに関連するオブジェクトを取得するためのいくつかのメソッドを追加できます。

+1

すごい! .primaryKey()が答えでした。 toOneマッピングは正常に機能しました。また、正しく動作するマッピングを試しました(ちょうど適切な場所で長い文字列を変更する必要があります)。それは私の時間を節約したり、定型コードを書いたりします。私はこれについて何かを見つけることができなかったように、より包括的なマニュアルがどこにあるのか分かりません。私は現在、greendaoのウェブサイト上の例だけを持っています。 – BobbyG

+0

素晴らしい。私は前にそれを試していないし、それを詳しく見ても時間が足りない。残念ながら私はgreendaoの他のマニュアルは知らない。便利なヒントや例はgoogle-group greendaoにあります。私はもちろんjavadocも使用しています。幸いにもgreendaoはopensourceです。あなたが何らかの行動について疑問に思っているなら、あなたはその情報源にlokを持つことができます。 greendaoはリフレクションを使用しないので、コードはかなり簡単です。 – AlexS

+0

私はまったく同じ状況にありました.BobbyG(私はAndroidアプリと私のウェブサイトの間で主キーの衝突を避けるためにUUIDを使用しています)。ご助力ありがとうございます!プライマリキーを文字列として使っても問題ありません。 – Guicara

関連する問題