2011-10-27 5 views
2

データを取得するためにWebサーバーと通信しているアンドロイドアプリを作成しています。私はprotobufとすべての作品を魅力のように使うことに決めました。protobufメッセージは変更不可能なリストを使用しており、データ構造として使用しようとしています

私の問題はこれです。私のデータセットは巨大で、すべてのデータを一度に取得することはできません。トップレベルを取得してから、私が進んでいくうちに(電話でブラウズ)もっと尋ねます。

protocを使用してJavaクラスを生成しましたが、これはうまく動作し、ちょうど私が望むように(データの最上位レベルのみで)私の素晴らしい光沢のあるオブジェクト構造を取得します。 しかし、私は私の主なデータ構造として私のアプリケーションで取得した構造を使用する決定を下し、そのアプリケーションのすべてのリストは変更不可能なので、後でデータを増やすことはできません。

現時点では、protocが生成した自動生成されたJavaファイルを単純に編集して、変更不可能ではなく通常のリストを返すようにしましたが、後でそのファイルを再生成する必要がある場合はかなり愚かです。

どのように対処しますか? protobufオブジェクトをストレージとして使用しないでください。 (私のストレージクラスの作成はもちろんのこと、すべてのデータをカスタムオブジェクトにコピーすることは無駄になります。)

答えて

1

生成されたプロトコルバッファクラスを変更しないでください。

生成されるメッセージクラスは、設計上不変です。オブジェクトを変更するには、対応するBuilderクラスを使用して既存のメッセージから新しいメッセージを生成し、セッターメソッドを使用してそれを操作し、変更されたオブジェクトを返すためにbuild()を呼び出します。たとえば:

person.toBuilder() 
    .setName("Jeff") 
    .addPhone(phoneNumber) 
    .build(); 

を参照してください "ビルダー対メッセージは、" いるProtobufチュートリアルで:

http://code.google.com/apis/protocolbuffers/docs/javatutorial.html#builders

+0

ありがとうございます。入ってくるデータをビルダーに変換し、それを自分のアプリケーションのデータ構造として保存するのは良いプラクシスでしょうか。またはスタンドアロンのデータ構造を持つことをお勧めしますか? –

+0

ビルダーは、特定のオブジェクトに対して1行のコードでアクセスまたは作成することができるため、なぜそれを格納したいのかわかりません。 Googleによると、生成されたプロトコルバッファクラスを独自のアプリケーション固有のクラスにラップすることがベストプラクティスです(リンクチュートリアルの「プロトコルバッファとO-O設計」を参照)。 –

+0

しかし、ビルダーは新しいオブジェクトを返します。私は自分の.protoにネストされたメッセージを持っているため、新しく生成されたオブジェクトを親オブジェクトのリストに挿入することはできません。 –