Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save protocol buffer classes directly using GreenDao

GreenDao provides an addProtobufEntity method to let you persist protobuf objects directly. Unfortunately I can't find much documentation explaining how to use this feature.

Let's say I'm trying to add a foreign key into my Message entity so I can access its PBSender protobuf entity. Here's my generator code:

// 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");

Unfortunately the generated code doesn't compile because it is trying to access a non-existant getId() method on my PBSender class:

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

Can anybody explain how relationships to protocol buffer entities are supposed to be managed?

GreenDao currently only supports Long primary keys. Does my protobuf object need a method to return a unique Long ID for use as a primary key?

If I remove my autoincremented ID then the generation step fails with this error:

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

like image 766
Dan J Avatar asked Mar 29 '26 22:03

Dan J


1 Answers

The greenDAO generator Entity source code suggests it currently does not support relations to protocol buffer entities:

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

However, I suspect that you could make this work if your Protobuf class contains a unique long ID and a public Long getId() method to return that ID.

like image 107
Dan J Avatar answered Mar 31 '26 10:03

Dan J



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!