2011-01-31 6 views
1

あなたのアプリケーションにpersistentObjectsがあるかどうか簡単に確認するにはどうすればいいですか?今、私は次のように使用しています:PersistentObject Blackberry

public boolean needsFirstTimeInit() { 
    PersistentObject persistentObject = getPersistentObject(Settings.TABLE_USERS); 
    Vector vector = (Vector) getVector(persistentObject); 
    if(vector.size()<=0){ 
     return true; 
    } 
    return false; 
} 

ここで負のは、私は、私はそれが存在している知っている、それが存在する場合、私はテーブルが初期化されていないと仮定したテーブルからデータを求めているということです。これを行うより良い方法はありますか?

答えて

0

次のソリューションは、私にとって最高の働いていました。

私は、tableNamesのすべてのハッシュコードを持つベクトルを作成しました。 (v1) ハッシュテーブル(hashcode tablename、PersistentObject)を作成しました。 (h1) 起動するたびに、v1のすべてのハッシュコードにh2の値(persistentObject)があるかどうかをチェックします。 そうでなければ、私はpersistentObjectを初期化し、それをハッシュテーブルに入れます。

1

あなたが示したコードはあまり正しくありません。あなたが何をする必要があるかを示す簡単な例がPersistentStoreのBlackBerry APIドキュメントにあります。

基本的には、ストアから取り出したPersistentObjectに対してgetContents()を呼び出します。 nullの場合、何も格納されておらず、setContents()を使用して初期化する必要があります。

+0

はい、ただし、テーブル名を指定する必要があります。 'persistentObjectsが存在しない場合'と言う方法はありませんか? – Vincent

+0

"テーブル名"とは、リレーショナルデータベースではありません。永続オブジェクトは、一意のキーを使用して識別されます。永続オブジェクトが存在するかどうかを知りたければ、そのためのAPIはありません。永続オブジェクト(永続オブジェクトが存在しない場合は作成する)または破棄するオブジェクトのみを取得できます。 –

+0

私はtablenameのhashcodeを使ってオブジェクトを検索します(私はおそらくそれをクリアにしておくべきです)。 – Vincent

0

特定の永続オブジェクトは特定のアプリケーションに関連付けられていないため、アプリケーションの永続オブジェクトについて話すのは意味がありません。

PersistentObjectを取得するために使用したGUIDを知っているアプリは、同じGUIDをPersistentStore.getPersistentObjectに渡して、同じオブジェクトを戻すことができます。つまり、PersistentStore.getPersistentObjectに使用するGUIDは、BlackBerryのすべてのアプリで一意である必要があります(実際にはこれを保証することは困難です)。したがって、特定のGUIDを使用して、nullのコンテンツを持たない永続オブジェクトを取得した場合、アプリはそれを保存している可能性があります(おそらく、同じ64ビットGUIDを使用する2つのアプリの可能性は低い)他のアプリが同じGUIDを持つオブジェクトを保存していることでしょうか。

実際には、ほとんどのアプリケーションでは、特定のGUIDに対して期待されるオブジェクトが返されたことを確認することはありませんし、問題は発生しません。しかし、GUIDの衝突のために奇妙なバグが発生するケースを認識しておく必要があります。

PersistentObjectをテーブルとしてみなされ、(オブジェクトでいっぱい)のベクトルが含まれています

+0

実際にはそうではありません...永続オブジェクトは、アプリケーションの一部であるクラスを永続化してアプリケーションを削除すると、永続オブジェクトが削除されるという意味で、アプリケーションに関連付けられます。言及したように、GUIDはデバイス全体で共有され、アプリケーションがデータを共有する方法の1つで、名前の衝突の可能性があります。 –

+0

True - と私は私の答えで言及したと思ったが、それは少し話題を降りているかもしれないと思った。 –