2012-02-09 20 views
0

ブラックベリーアプリケーションでユーザーが利用できる通知の数を記録する永続的な共有変数を作成しようとしています。この番号はホーム画面に表示され、デバイスの電源を切ってもアプリケーション自体をチェックしてから番号がリセットされるまで保持する必要があります。 http://supportforums.blackberry.com/t5/Java-Development/Storing-persistent-data/ta-p/442747Javaの永続ストアJavaランタイムストア

import net.rim.device.api.system.RuntimeStore; 

public class IconManager { 
    private static IconManager _instance; 
    private static final long GUID = 0xab4dd61c5d004c18L; 
    private int iconCount; 

    // constructor 
    private IconManager() { 
     iconCount = 0; 
    } 

    public static IconManager getInstance() { 
     if (_instance == null) { 
      _instance = (IconManager) RuntimeStore.getRuntimeStore().get(GUID); 
      if (_instance == null) { 
       IconManager singleton = new IconManager(); 

       RuntimeStore.getRuntimeStore().put(GUID, singleton); 
       _instance = singleton; 
      } 
     } 
     return _instance; 
    } 

    public int getCount() {    
     return iconCount; 
    } 

    public void setCount(int count) {  
     iconCount = count; 
    } 
} 

が、私は主に永続ストアの部分を把握しようとするために、このサイトを使用している:私は、バックグラウンド・プロセスと以下のUIアプリ自体の間で変数を共有するためにシングルトンを使用しています上記のランタイムストアを使用して永続ストアを実装する代替手段はありますか?私はもともとBlackberryの例のコードを使うことを考えていましたが、これをどうやって行うのか混乱しています。別のスレッドのユーザーからmparizeauは、次のように書いた:

persistentCount = PersistentStore.getPersistentObject(0xdec6a67096f833cL); 
synchronized (persistentCount) { 
    if (persistentCount.getContents() == null) { 
     persistentCount.setContents(new StoreInfo()); 
     persistentCount.commit(); 
    } 
} 
_data = (StoreInfo)persistentCount.getContents(); 

あなたはそれを更新し、PersistentStoreに保存したいときに今、あなたのようなもの持つことができます。

_data.incElement(); 
synchronized(persistentCount) { 
    persistentCount.setContents(_data); 
    persistentCount.commit(); 
} 

を、これは上記で使用することができ何とかコード?私は非常にJavaとBBの開発には非常に新しいので、任意の助けをいただければ幸いです。

+0

正確に必要なものは?明確に指定してください。 –

答えて

1

私はあなたがRunTimeStoreを使いたいと思っていません。デバイスをオフにしても情報を保持したいからです。からthis page

ランタイムストアは永続的ではありません。 BlackBerry デバイスを再起動すると、ランタイムストア内のデータが消去されます。

はこのような何かを試してみてください:。

public class IconManager { 
    private static IconManager _instance; 
    private final long GUID = 0xab4dd61c5d004c18L; 
    private PersistentObject store; 
    private int iconCount; 

    private IconManager() { 
     store = PersistentStore.getPersistentObject(GUID); 
     synchronized(store) { 
      if(store.getContents() == null) { 
       store.setContents(new Integer(0)); 
       store.commit(); 
      } 
     } 
     iconCount = ((Integer)store.getContents()).intValue(); 
    } 

    public static IconManager getInstance() { 
     if (_instance == null) { 
      _instance = new IconManager(); 
     } 
     return _instance; 
    } 

    public int getCount() {    
     return iconCount; 
    } 

    public void setCount(int count) {  
     iconCount = count; 
     synchronized(store) { 
      store.setContents(new Integer(iconCount)); 
      store.commit(); 
     } 
    } 
} 
+0

おかげさまで大変ありがとうございました!コードは完全にコンパイルされますが、iconCount宣言を静的に変更した場合に限ります。今、私はその宣言に静的なものを置くことでコードがうまく動作しない場合に問題が発生しましたが、残念ながらiconCount変数はこの場合には保存されません。私は、コンパイルするためにiconCountが静的に変更されていることと関連があると思う。あなたはこれを回避する方法を知っていますか? – user1152440

+0

また、上記のコードからシングルトンを何とか格納する必要はありませんか?シングルトンは2つのイベントの間で変数を同期させたものだと思ったので、共通変数を共有するイベント1とイベント2の関係を破壊しないでください。 – user1152440

+0

この場合、実際には静的であったはずです。しかし、私はちょうどあなたが実際にそれが静的である必要がないシングルトンとして使用していることに気付いた、あなたは静的な初期化子のものをコンストラクタに移動することができるはずです。これを反映するようにコードを更新します。 – mparizeau

0

ブラックベリーOSの5以降は、SQLiteのが組み込まれていますが、その代わりに、永続ストアを使用することができます。 (jdbcのようなAPIを持っています)。 BBOS 5は現在かなりの期間外出しています。

関連する問題