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
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法