Java初心者による携帯アプリ作成講座その6::携帯端末にデータを保存する方法

By uchida - 08/11/27 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

今回は携帯端末にデータを保存する方法を解説します。
 
PCプログラムがデータを保存する場合はハードディスクを使用しますが、携帯端末の場合はメモリに記憶させます。これをスクラッチパッドといいます。不揮発メモリに保存するため電源オフにしてもデータは残ります。

※スクラッチパッドはセキュリティー保護の為、他のアプリで保存したデータを読み込むことはできません


スクラッチパッドの使用容量はiapplitoolメニュー[プロジェクト]->[ADF設定]から設定できます。

 


 
スクラッチパッドの最大値

 503i   10kb 
 504i   100kb 
 505i   200kb 
 900i   400kb 

 
こちらを利用してデータを読み書きできるようになります。
ネットワーク上から画像をダウンロードしたり、ゲーム内容を保存するのに必要となってきます。

それでは今回はサンプルとしてメモ帳を作成します。


ファイル名:sample6.java

//インポート
import com.nttdocomo.ui.*;
import javax.microedition.io.*;
import java.io.*;

public class sample6 extends IApplication {
  public void start() {
      // panelオブジェクト生成
      MainPanel w_panel = new MainPanel(this);

      // ソフトキー1ラベルに"クリア"を設定
      w_panel.setSoftLabel(w_panel.SOFT_KEY_1,"クリア");

      // ソフトキー2ラベルに"終了"を設定
      w_panel.setSoftLabel(w_panel.SOFT_KEY_2,"終了");

      // mycanvasオブジェクトを画面にセット
      Display.setCurrent(w_panel);
  }
}

class MainPanel extends Panel implements ComponentListener, SoftKeyListener {
    // 変数宣言
    IApplication iapp;
    private Label        w_label;
    private TextBox      w_text;
    private Button       w_button1;
    private Button       w_button2;
    private Dialog       w_dialog;
    private HTMLLayout   w_layout;

    public MainPanel(IApplication ap) {
        // アクションを退避
        this.iapp = ap;
        
        // オブジェクトの生成
        w_label   = new Label("文字を入力:");
        w_text    = new TextBox("", 20, 7, TextBox.DISPLAY_ANY);
        w_button1 = new Button("保存");
        w_button2 = new Button("読込");
        w_dialog  = new Dialog(Dialog.DIALOG_INFO,"INFO");
        w_layout  = new HTMLLayout();
        
        // 画面にオブジェクトをセット
        this.setLayoutManager(w_layout);
        w_layout.begin(HTMLLayout.CENTER);
        this.add(w_label);
        w_layout.br();
        this.add(w_text);
        w_layout.br();
        this.add(w_button1);
        this.add(w_button2);
        w_layout.br();
        w_layout.end();

        // タイトルセット
        setTitle("Sample Program");

        // リスナーをインスタンス生成
        setSoftKeyListener(this);
        setComponentListener(this);
    }
    
    // コンポーネントイベント発生時に実行
    public void componentAction(Component w_component, int w_type, int w_param){
        if((w_component == w_button1) && (w_type == this.BUTTON_PRESSED)){
            // 保存
            try{
                DataOutputStream dos = Connector.openDataOutputStream("scratchpad:///0");
                dos.writeUTF(w_text.getText());
                dos.close();
            }catch(IOException ioe){
                System.out.println(ioe.toString());
            }
        }
        if((w_component == w_button2) && (w_type == this.BUTTON_PRESSED)){
            // 読込
            try{
                DataInputStream dis = Connector.openDataInputStream("scratchpad:///0");
                String data = dis.readUTF();
                w_text.setText(data);
                dis.close();
            }catch(IOException ioe){
                System.out.println(ioe.toString());
            }
        }
    }
    
    public void softKeyPressed(int key) {
        switch (key) {
            case Frame.SOFT_KEY_1:
                textClear();
                break;
            case Frame.SOFT_KEY_2:
                iapp.terminate();
                break;
        }  
    }
    
    public void softKeyReleased(int arg0) 
    {
        
    }
    
    // テキストフィールドクリア処理
    public void textClear(){
        w_text.setText("");
    }
}

 
解説
前回のサンプルを流用してメモ帳を作成します。
ボタンにより入力したテキストの読み書きを行います。
まず、「import javax.microedition.io.*」「import java.io.*」をインポートします。
 
既存の「クリック!」ボタンを削除し以下の通り新規でボタンを作成します。

    w_button1 = new Button("保存");
    w_button2 = new Button("読込");

 
そして、ボタンクリックイベント発生時にスクラッチパッドへの処理を作成します。

    // コンポーネントイベント発生時に実行
    public void componentAction(Component w_component, int w_type, int w_param){
        if((w_component == w_button1) && (w_type == this.BUTTON_PRESSED)){
            // 保存
            try{
                DataOutputStream dos = Connector.openDataOutputStream("scratchpad:///0");
                dos.writeUTF(w_text.getText());
                dos.close();
            }catch(IOException ioe){
                System.out.println(ioe.toString());
            }
        }
        if((w_component == w_button2) && (w_type == this.BUTTON_PRESSED)){
            // 読込
            try{
                DataInputStream dis = Connector.openDataInputStream("scratchpad:///0");
                String data = dis.readUTF();
                w_text.setText(data);
                dis.close();
            }catch(IOException ioe){
                System.out.println(ioe.toString());
            }
        }
    }

 
データ読込に失敗した場合、IOExeptionが生じますので、必ず例外処理を加える必要があります。
次にConnectorオブジェクトを生成します。
データ保存時→DataInputStream dos = Connector.openDataOutputStream(“scratchpad:///0”);
データ読込時→DataInputStream dis = Connector.openDataInputStream(“scratchpad:///0”);
 
データの取り扱い時、型を宣言する必要があります。今回はメモ帳ということで文字列で処理します。
データ保存時→dos.writeUTF(w_text.getText());
データ読込時→String data = dis.readUTF();
 
以上がスクラッチパッドの簡単な使用例となります。
その他の機能としては、一つのプログラムにスクラッチパッドを分割する方法(機種依存があります)や、データの取り扱い時の型によるメソッドの違いなどがあります。

次回はネットワーク接続について解説したいと思います。