Tips

Android データ入出力と永続化 プリファレンス 【Android Tips】

プリファレンス

8
データ入出力と永続化
プリファレンス
この章ではプリファレンスについて解説していきます。
管理者権限について
プリファレンスの解説に入る前に、まず保存したデータの確認方法について解説します。

ファイルの中身を確認するにはroot化が必要になります。
root化とは当該ユーザーに管理者権限を与えることで、パソコンに例えるとわかり易いのですが、Windowsの場合はadministrator、Linuxの場合はrootが管理者権限を持ったユーザーに当たります。

Android端末は通常、root化されていません。
当然のことですが、Android端末の管理者権限を取得することは危険を伴います。操作によっては携帯電話としてのAndroid端末に、致命的な損傷を与えてしまう可能性があるからです。

次の図はroot化されていない端末をDDMSで確認した際の図です。

こちらはエミュレータをDDMSで確認した際の図です。

上下の図を比較するとわかりますがdataフォルダの中身は、上図のroot化されていない実機では確認できませんが、下図のエミュレータでは確認できることがわかります。

したがって、端末内に作成されたデータベース等を確認したい場合は、Android端末をroot化するか、エミュレータを使用しなければなりません。このテキストではエミュレータを用いて確認していきます。

※各Android端末のroot化方法などはインターネット上に数多く存在していますが、永久に使い物にならなくなる(いわゆる文鎮化)可能性も非常に高いので、どうしても実施したい場合は十分に注意をし、自己責任で実施してください。

プリファレンスの概要と使用方法
プリファレンスはアプリの設定情報などを保存することに適した仕組みです。プリファレンスは「キー」と「値」の組み合わせにより、データの保存や復元を行っています。

プリファレンスはxml形式で記述されており、複雑なデータ等は保存できません。
したがって、主にアプリの設定情報といった単純なデータの保存に使用することが多いです。

プリファレンスに保存できるデータ型は次の5種類です。

  • String
  • int
  • boolean
  • long
  • float

プリファレンスの保存先は「data/data/パッケージ名/shared_prefs/」です。
保存されたデータはアプリケーションを削除すると、すべて破棄されます。
また、root化された端末では他のアプリケーションのプリファレンスにアクセスできてしまうため、重要な情報(パスワード等)は暗号化して保存する機構が必要不可欠です。

プリファレンスはxmlファイルとして保存され、その中身は次のようになっています。

<string name=“SAMPLE_KEY”>SAMPLE_VALUE</string>
<int name=“SAMPLE_INT_KEY”>100</int>
 

プリファレンスへのデータ保存方法
プリファレンスへデータを保存する方法は次のようになります。

  1. SharedPreferencesオブジェクトを取得
  2. getSharedPreferences()またはgetPreferences()を使用し、SharedPreferencesオブジェクトを取得します。

  3. Editorオブジェクトを取得
  4. SharedPreferencesオブジェクトのedit()を使用し、Editorオブジェクトを取得します。

  5. putメソッドでデータを編集
  6. putBoolean()やputString()等のメソッドで値を追加します。

  7. commitメソッドでデータを保存
  8. Editorオブジェクトのcommit()でデータをプリファレンスに保存します。

実際は以下のように記述します。ここではprefというxmlファイルを作成し「person」というキーと「山田」という値を保存しています。

SharedPreferences preferences= getSharedPreferences("pref", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("person", "山田");
editor.commit();

1行目のgetSharedPreferences()は、データを保存するファイルのファイル名(第一引数)と公開範囲(第二引数)を指定しています。
第二引数は公開範囲を指定しますが、指定できる値は次の3種類です。

定数名 概要
MODE_WORLD_READABLE 他のアプリケーションから読み取り可能
MODE_WORLD_WRITEABLE 他のアプリケーションから書き込み可能
MODE_PRIVATE 他のアプリケーションからアクセス不可


 

3行目のputBoolean()は、キーの名前(第一引数)と保存する値(第二引数)を指定しています。
上記の他にも値のデータ型により、下記のメソッドを使用します。

  

データ型 メソッド
boolean putBoolean(String key, boolean value)
int putString(String key, String value)
String putInt(String key, int value)
long putLong(String key, long value)
float putFloat(String key, float value)


プリファレンスからのデータ取得方法
プリファレンスからデータを取得する方法は次のようになります。

  1. SharedPreferencesオブジェクトを取得
  2. getSharedPreferences()またはgetPreferences()を使用してSharedPreferencesオブジェクトを取得します。

  3. getメソッドでデータを取得
  4. getBoolean()やgetString()等を用いて値を取得します。

ここではprefというxmlファイルの「silentMode」というキーの値を取得しています。

SharedPreferences preferences = getSharedPreferences("pref", MODE_PRIVATE);
preferences.getBoolean("silentMode", true);

2行目のgetBoolean()の第一引数はキーの名前を指定します。
第二引数は、第一引数にて指定したキーに対する値が見つからなかった場合に用いる値を指定します。
値が存在している場合は、その値を取得します。

サンプルコード
それではサンプルコードを実際に動かしながら確認していきましょう。
activity_main.xml(レイアウトファイル)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="名前を入力してください。" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登録" />

</LinearLayout>

MainActivity.java(Activityファイル)

package com.example.preferencesample;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				EditText editText = (EditText) findViewById(R.id.editText1);
				String str = editText.getText().toString();

				SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
				SharedPreferences.Editor editor = preferences.edit();
				editor.putString("text", str);
				editor.commit();

				Toast.makeText(MainActivity.this, str + "さんを登録しました。", Toast.LENGTH_SHORT).show();

			}
		});

	}
}

サンプルアプリを実行し、名前を入力すると写真のようになります。
この段階で名前は保存されます。

 

EclipseのDDMSよりアプリを実行したエミュレータを確認すると下記場所にファイルが作成されます。
「data/data/com.example.preferencesample/shared_prefs/name.xml」

 

ファイルを選択し、赤枠のアイコンをクリックすると任意の場所にファイルを出力します。

 

出力したファイルを展開すると下記のようになっています。
キーは指定した「text」で、値は「Yamada」となっているのが確認できますね。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="text">Yamada</string>
</map>

 

プリファレンスはこのようにしてキーと値を保存しています。

Androidアプリ開発の必須知識!JAVAプログラミングを学べる連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search