Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

レコードストア

au、Softbankの携帯アプリで、文字列を保存したかった
ので、調べてRecordStoreを使えばいいとわかりました。

また、1つの文字列をバイトに変換し、保存・読み込み
をすることはできました。

しかし、2つ以上の文字列をバラバラに保存するとき、
RecordStoreのレコードIDを変えたらいいとおもったので
すが、エラーが起こってしまいます。
コードを書くので、どこが悪いのか、また、どうしたら
いいのかを教えていただけたら幸いです。

public static void Save() throws Exception{
    RecordStore rs0 = null;
    byte[] svByte0 = str[0].getBytes("UTF-8");
    byte[] svByte1 = str[1].getBytes("UTF-8");
    byte[] svByte2 = str[2].getBytes("UTF-8");

    try {
        rs0 = 
           RecordStore.openRecordStore("one",true);

    if(rs0.getNumRecords() == 0) {
        rs0.addRecord(svByte0, 0, svByte0.length);
        rs0.addRecord(svByte2, 0, svByte2.length);
    }else {
        rs0.setRecord(1, svByte0, 0, 
                             svByte0.length);
        rs0.setRecord(2, svByte2, 0, 
                              svByte2.length);
    }
            
    rs0.closeRecordStore();
    }catch(Exception e) {
    try {
        if (rs0!=null) rs0.closeRecordStore();
    } catch (Exception e2) {
    }   
    throw e;
    }
}


レコードIDの2でいつもエラーが起こります。
RecordStore rs1をつくり、もうひとつレコードストアを
接続したら、エラーは起こらないのですが、この方法で
は、コードが長くなり、根拠はなく、勝手な考えです
が、正しい方法ではないと思いました。
正しい方法を教えていただければ幸いです。

9

回答

4719

閲覧

9件の回答

評価

0

エラーの内容が不明ですが
直前のif文が実行されているかどうか不明だけど
レコードID=2に対応する
レコードストアが存在しているカナ?

評価

0

回答ありがとうございます。

レコードID:2に対応するレコードスコアですか?
レコードIDは、たとえば今回のrs0をさらに分割するため
に使用するものと思っていました。

つまり、re0のID1とrs0のID2というふうにするものと
思っていましたが、この考え方が違うのでしょうか?

ID2に対応するレコードスコアが存在してないということ
は例えば

RecordStore rs1 = RecordStore.openRecordStore("name",true);

といった具合にレコードストアをつくらないといけない
ということなのでしょうか?

質問ばかりですみません。

評価

0

もう一度言いますが
どんなエラーが出ているん?


// svByte0をレコードストアに追加格納する。利用されるレコードIDは戻り値idで示される。
int id = rs0.addRecord(svByte0, 0, svByte0.length);
addRecordの2行がちゃんと実行されているなら
レコードID2のレコードストアは存在していそう。

あと
rs0.closeRecordStore();
はfinallyで行うこと。
開いたら閉じる
これプログラムのお約束ネ。

レコードストアは1個でいいはず
何か別の原因があるならともかく。

まあエラーが何か判らないのでなんとも。

評価

0

すみません。エラーについて書きます。

今、6行にわたって文字列を表示しているのですが、

1行目
2行目
3行目
4行目
5行目
6行目

という感じなのですが、例えば、1行目という文字列を「こんにちわ」に変えるのは普通にできるのですが、その後続けて2行目を「ありがとう」などに変えると1行目が「こんにちわ」から「1行目」に戻ってしまってしまいます。

1行目を変えて、保存し、一度アプリを終わり、もう一度起動すると、変えれるのですが、つまり、1回の起動で2つ以上の行の文字を変えることができないんです。

ちなみに、保存は文字を変えたあと、ソフトキーでできるようにしていて、読み込みはextends Canvas をもつクラスを最初にインスタンス化するときに読み込むようにしています。

また、テキスト入力はFormをextendsしたクラスで行うようにしているため、Display.〜setCurrent();で画面切り替えています。

よろしくお願いします。

評価

0

「エラー」の意味知ってる?
自分の思いと違う結果になることではないよ。

評価

0

そうですね。

エラーじゃなくてバグ・・・とも違うのかな?
とにかく、言葉の選択間違えていました。
すみませんでした。

評価

0

これは手に負えない。

int i;
i="abc";

これでどういうエラーがでるでしょう?

評価

0

なるほどー
例外が発生しているわけではないのね

既に
1:1行目
2:2行目
となっているレコードストア"one"に

RecordStore rs = openRecoreStore("one", false);
byte[] n1 = "こんにちは".getBytes("UTF-8");
byte[] n2 = "ありがとう".getBytes("UTF-8");
setRecord(1, n1, 0, n1.length);
setRecord(2, n2, 0, n2.length);
rs.closeRecordStore();

すれば

1:こんにちは
2:ありがとう

こうなるはずです。
最初に提示されているソースコードだと正しそうだけど。
提示していない箇所に何か問題がるとか?

もしかしたら

RecordStore rs = openRecoreStore("one", false);
byte[] n1 = "こんにちは".getBytes("UTF-8");
setRecord(1, n1, 0, n1.length);
rs.closeRecordStore();
rs = openRecoreStore("one", false);
byte[] n2 = "ありがとう".getBytes("UTF-8");
setRecord(2, n2, 0, n2.length);
rs.closeRecordStore();

こうしないといけないと言う決まりがあったりするのかもしれない

評価

0

ご回答ありがとうございます。
最初に提示したソースコードが正しそうとのことで、保存・読み込みの部分は間違えていないと仮定し、全体を見直してみたところ、保存をするメソッドを呼び出すタイミングが悪かったようで、呼び出すタイミングを変えたら無事思い通りにいくようになりました。

てんこさん、wさん、$さん、本当にありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。