3

GreenDao提供了一個addProtobufEntity方法來讓您直接保持protobuf對象。不幸的是我找不到很多文件解釋如何使用這個功能。如何使用GreenDao直接保存協議緩衝區類

假設我正在嘗試將外鍵添加到Message實體中,以便可以訪問其PBSender protobuf實體。這裏是我的生成代碼:

// Define the protobuf entity 
Entity pbSender = schema.addProtobufEntity(PBSender.class.getSimpleName()); 
pbSender.addIdProperty().autoincrement(); 

// Set up a foreign key in the message entity to its pbSender 
Property pbSenderFK = message.addLongProperty("pbSenderFK").getProperty(); 
message.addToOne(pbSender, pbSenderFK, "pbSender"); 

不幸的是,生成的代碼不編譯,因爲它試圖訪問我的PBSender類不存在的getId()方法:

public void setPbSender(PBSender pbSender) { 
    synchronized (this) { 
     this.pbSender = pbSender; 
     pbSenderID = pbSender == null ? null : pbSender.getId(); 
     pbSender__resolvedKey = pbSenderID; 
    } 
} 

任何人可以解釋應該如何管理協議緩衝區實體的關係?

GreenDao目前只支持Long主鍵。我的protobuf對象是否需要一個方法來返回一個唯一的Long ID作爲主鍵?

如果我刪除我的自動遞增的ID,然後生成步驟失敗,此錯誤:

java.lang.RuntimeException: Currently only single FK columns are supported: ToOne 'pbSender' from Message to PBSender

+0

對不起,但我沒有使用greendao的經驗。 – CommonsWare

+0

你給了什麼賞金?您的回答已經描述了實際狀態和限制。你想爲greendao擴展嗎? – AlexS

+0

我在發佈我的答案之前添加了賞金。我只是希望更多地關注這個問題,但如果有人能夠提供更好的答案或提供greenDAO擴展,那將是非常棒的! –

回答

2

greenDAO generator Entity source code表明,它目前不支持關係協議緩衝實體:

public ToMany addToMany(Property[] sourceProperties, Entity target, Property[] targetProperties) { 
    if (protobuf) { 
     throw new IllegalStateException("Protobuf entities do not support realtions, currently"); 
    } 

    ToMany toMany = new ToMany(schema, this, sourceProperties, target, targetProperties); 
    toManyRelations.add(toMany); 
    target.incomingToManyRelations.add(toMany); 
    return toMany; 
} 

/** 
* Adds a to-one relationship to the given target entity using the given given foreign key property (which belongs 
* to this entity). 
*/ 
public ToOne addToOne(Entity target, Property fkProperty) { 
    if (protobuf) { 
     throw new IllegalStateException("Protobuf entities do not support realtions, currently"); 
    } 

    Property[] fkProperties = {fkProperty}; 
    ToOne toOne = new ToOne(schema, this, target, fkProperties, true); 
    toOneRelations.add(toOne); 
    return toOne; 
} 

然而,如果你的Protobuf類包含一個唯一的長ID和一個public Long getId()方法來返回這個ID,我懷疑你可以做這個工作。