Android - SharedPreferencesに簡単なデータを保存する方法

By JS | Last updated: June 21, 2020

AppはSharedPreferencesを利用してInteger、Stringなどの単純なデータを保存することができます。 数字いくつか、文字列のいくつか程度のデータを保存する必要がするSQLiteのようなDBを利用いう面倒ときに使用すると良いです。

SharedPreferencesはAppの個々のデータストアにxmlファイルを作成し、そのファイルにInteger、Stringなどのデータを保存したり、読み取ります。 データを保存するときは、 key/value形式で保存します。

特徴を整理すると、次のとおりです。

  • SharedPreferencesは、単純なデータをアプリ内の個々のストアにxmlファイルとして保存
  • SharedPreferencesオブジェクトを作成するときに、ファイル名を引数として渡され、その名前でxmlファイルが生成
  • データを保存するときは、 key/value形で私
  • データは、Appの個々のデータストアに保存されるので、他のAppと共有することができない
  • SharedPreferencesはput / getメソッドを提供して、データを保存したり、読み取ることができている

ここAppがSharedPreferencesを利用して、データを保存して読む方法について説明します。

SharedPreferencesオブジェクトの作成

次のように getSharedPreferences()を呼び出してSharedPreferencesオブジェクトを生成することができます。

companion object {
    const val sharedPrefFile = "app_preferences"
}

private lateinit var mPreferences: SharedPreferences

override fun onCreate(savedInstanceState: Bundle?) {
    ....
    mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
}

SharedPreferencesは内部的にアプリのデータフォルダーにxmlファイルを生成するとしている。 getSharedPreferences()の引数で sharedPrefFileは、ファイルの名前です。 このファイルにデータを保存し、このファイルからデータをロードします。

本当にファイルが生成されることを確認

adb shellで私のアプリのデータフォルダーを見ると、 ../shared_prefs/パスに app_preferences.xmlという名前でファイルが生成されたことを見ることができます。

一般のデバイスは、shellがアプリのデータフォルダーにアクセスする権限がありません。エミュレータで adb rootにルーティングすると、データのフォルダへのアクセス権を取得することができます。

/data/data/com.codechacha.sharedpreferences/shared_prefs # ls
app_preferences.xml

SharedPreferencesにデータを保存する

データを保存するときは、 SharedPreferences.Editorを通じて行うことができます。 次のように mPreferences.edit()でEditorオブジェクトを取得することができます。

val preferencesEditor: SharedPreferences.Editor = mPreferences.edit()

そして putString()putInt()などのAPIを介してデータを保存することができます。 データは、 key/value形で保存することができます。最初の引数がkeyであり、二番目の引数がvalueです。

companion object {
    const val KEY_IMAGE_HEIGHT = "image_height"
    const val KEY_IMAGE_WIDTH = "image_height"
    const val KEY_IMAGE_TITLE = "image_title"
    const val KEY_IMAGE_WEIGHT = "image_weight"
}

preferencesEditor.putString(KEY_IMAGE_TITLE, "My photo")
preferencesEditor.putInt(KEY_IMAGE_HEIGHT, 100)
preferencesEditor.putInt(KEY_IMAGE_WIDTH, 200)
preferencesEditor.putFloat(KEY_IMAGE_WEIGHT, 2.0f)

Editorは、次のようなput apiを提供しています。

  • putString()
  • putInt()
  • putLong()
  • putBoolean()
  • putStringSet()
  • putFloat()

put()をしたデータがすぐにxmlファイルに保存されたわけではない。 データをファイルに保存するには、次のように apply()を呼び出す必要があります。 apply()は非同期的に(asynchronously)動作するため、処理中のThreadがBlockingません。

preferencesEditor.apply()

Editor.commit()は同期(synchronously)動作するため、処理中のスレッドがblockingされることがあります。そのため、保存されるまで待つ必要がない場合は apply()を使用することをお勧めします。

データがxmlに保存されていることを確認

apply()を呼び出したとき、xmlファイルにデータが保存されるか確認しました。

.../shared_prefs # cat app_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <int name="image_height" value="100" />
    <int name="image_width" value="200" />
    <string name="image_title">my image</string>
    <float name="image_weight" value="2.0" />
</map>

データを保存して読む時点

データを保存される理由は、通常、Activityが再実行されるときに、以前に保存した状態を元に戻すためです。 そのため、 onPause()が呼び出されると、データを保存することをお勧めします。 または自分が適当と思われる時点でデータを保存します。

データを読むとき onCreate()のように初期化をする時点で読むか、または保存されたデータが必要な時点で読んでご使用下さい。

SharedPreferencesからデータを読み取る

SharedPreferencesからデータを読み込むときは、 Editオブジェクトが必要ありません。

次のようにSharedPreferencesで get() apiを提供しています。

val title = mPreferences.getString(KEY_IMAGE_TITLE, "default_title")
val width = mPreferences.getInt(KEY_IMAGE_WIDTH, 0)
val height = mPreferences.getInt(KEY_IMAGE_HEIGHT, 0)
val weight = mPreferences.getFloat(KEY_IMAGE_WEIGHT, 0.0f)
Log.d(TAG, " title: $title, width: $width, height: $height, weight: $weight")

次のようにgetメソッドを提供します。二番目の引数はデフォルトでは、keyのデータがない場合、この値が返されます。

  • String getString(String key, String defValue)
  • int getInt(String key, int defValue)
  • long getLong(String key, long defValue)
  • float getFloat(String key, float defValue)
  • boolean getBoolean(String key, boolean defValue)
  • Set getStringSet(String key, Set defValues)

Output:

06-21 13:35:56.793  6655  6655 D MainActivity:  title: my image, width: 100, height: 100, weight: 2.0

すべてのデータを削除する

どのファイルに保存されたすべてのデータを削除する場合は Editor.clear()を呼び出し、 apply()で削除された内容がファイルに保存されるようにします。

val preferencesEditor: SharedPreferences.Editor = mPreferences.edit()

preferencesEditor.clear()

preferencesEditor.apply()

実際のxmlファイルを確認してみると、すべて消去されたことを見ることができます。

../shared_prefs # cat app_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map />

Setオブジェクトの保存と読み込み

SharedPreferencesは、Setオブジェクトを格納することができるAPIを提供します。 Listは、データの順序を保証してSetは順序を保証していないので、この二つは異なるが、複数のオブジェクトを持っているCollectionです。

持っているリストの保存順序が重要でない場合Setに保存することを検討してみる価値はあります。

次のようにSetをSharedPreferencesに保存することができます。

companion object {
    const val KEY_SETS = "key_array"
}

val preferencesEditor: SharedPreferences.Editor = mPreferences.edit()

val sets: Set<String> = setOf("Apple", "Kiwi", "Banana", "Peach")
preferencesEditor.putStringSet(KEY_SETS, sets)

preferencesEditor.apply()

xmlデータを確認してみると、このように保存されています。

../shared_prefs # cat app_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <set name="key_array">
        <string>Apple</string>
        <string>Kiwi</string>
        <string>Peach</string>
        <string>Banana</string>
    </set>
</map>

読むときは、次のように読んでいます。

val sets = mPreferences.getStringSet(KEY_SETS, setOf())

参考

Related Posts

codechachaCopyright ©2019 codechacha