LoginSignup
58
55

More than 5 years have passed since last update.

GarumとSharedPreferencesへの異常なまでの愛

Last updated at Posted at 2014-12-11

はじめに


 @operandoOS 

 Android Advent Calendar 2014 11

Annotation styleSharedPreferencesGarum

Garum

Let's go Garum

SharedPreferences


SharedPreferences

SharedPreferences


Android



key-value

XML


使API Guides -> Storage Options -> Using Shared Preferences 

SharedPreferences


SharedPreferences使API

SharedPreferences




問題 なぜ辛い?
Utilクラスパターン Utilクラスの実装をもうしたくない。好みが出るので辛い。ほぼわがまま。
Mode問題 セキュアじゃないModeを使う人がいて辛い。
getDefaultSharedPreferences問題 全ての値を一つのSharedPreferencesで管理する。数が増えると辛い。
Keyのベタ書き問題 Keyの名前を定数化せず、色んなところでベタ書きしてる。変更に弱いので辛い。

 

Util


SharedPreferencesUtil2


Key - 

Key - 


2

Key - 


Key()SharedPreferencesUtil

KeyUtil使SharedPreferences

Google I/OioschedPrefUtils




KeyKey

UtilKey

Key - 


KeySharedPreferencesUtil

使KeySharedPreferences

RebuildRebuildPreferenceUtils


ioschedPrefUtilsKeyKey



KeySharedPreferences

UtilUtil

Util使Util

Mode - 


getDefaultSharedPreferences使ModeMODE_PRIVATE

MODE_PRIVATE

getSharedPreferences使Mode

Mode


MODE_WORLD_READABLE

MODE_WORLD_WRITEABLE


2ModeAPI Level 17

ModeMode使UtilModeMODE_PRIVATE


getDefaultSharedPreferences


getDefaultSharedPreferences使
package com.os.operando.sharedpreferences.sample;

// this -> Context
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

getDefaultSharedPreferencesメソッドを使用すると、以下のように「パッケージ名 + _preferences.xml」というXMLが作成されます。

/data/data/[package name]/shared_prefs/com.os.operando.sharedpreferences.sample_preferences.xml

getSharedPreferencesメソッドと比べると、引数が少ないことやファイル名を自身で考えなくてもいいという点があります。

package com.os.operando.sharedpreferences.sample;

SharedPreferences sp = getSharedPreferences("app_pref", MODE_PRIVATE);
// → /data/data/[package name]/shared_prefs/app_pref_preferences.xml

getDefaultSharedPreferences使






SharedPreferences

I/OXML




SharedPreferences10getDefaultSharedPreferences使

SharedPreferences10

SharedPreferences


SharedPreferences

SharedPreferences使

Key

I/OXML


SharedPreferencesXML

I/OSharedPreferencesstaticAPI

SharedPreferencesstaticI/O

Key


SharedPreferenceskey-valueKey

Key
SharedPreferences sp = getSharedPreferences("app_pref", MODE_PRIVATE);

sp.getBoolean("key_sample", false);

sp.edit().putBoolean("key_sample", true).commit();

Keykey_sample

Key

使

KeyKey

Garum - Annotation style SharedPreferences


SharedPreferences

SharedPreferences



 

SharedPreferences使Garum 

Garum - https://github.com/operando/Garum

Garum使SharedPreferenceskey-value



Model

Garum使ActiveAndroid

ActiveAndroidSharedPreferences使

Garum


jarlibs使 

http://operando.github.io/Garum/#dowonload

Mavenjar

 0.0.2


Model


ModelSharedPreferencesXML

Model


PrefModel

@Pref

SharedPreferences()@PrefKeya

Key

Key@PrefKeyKey


@Pref


publicprivate

privateLombok@Data
@Pref(name = "app_status")
public class AppStatus extends PrefModel {

    @PrefKey("name") // 別の名前をつける。Keyの名前は「name」となる
    public String appName;

    @PrefKey
    public int startupCount;

    @PrefKey
    public boolean showNotification;
}

Keyが保存されていなかった際のデフォルト値をフィールドに指定できるアノテーションも用意しています。

デフォルト値として、以下の型については、リソース定義したものを使用することも可能です。

  • int
  • booelan
  • String
  • Set
@Pref(name = "app_status")
public class AppStatus extends PrefModel {

    @PrefKey
    @DefaultString("test")
    public String appName;

    @PrefKey
    @DefaultInt(redId = R.Integer.test_integer)
    public int startupCount;

    @PrefKey
    @DefaultBoolean(false)
    public boolean showNotification;
}

Garumの初期化

作成したModelを使用するには、ライブラリにModelを読み込ませる必要があります。

ApplicationクラスのonCreateメソッドなどに、Garum.initializeメソッドを書くことでModelの読み込みが自動的に行われます。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Garum.initialize(getApplicationContext());
    }
}

ActiveAndroid使Model

Model

ActiveAndroidModel

AppStatus/PrefModel/UseStatusModel

Model
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Context context = getApplicationContext();
        Configuration.Builder builder = new Configuration.Builder(context);
        builder.setModelClasses(AppStatus.class, PrefModel.class, UseStatus.class);
        Garum.initialize(builder.create());
    }
}

saveメソッド - 値を保存する

ではでは、Modelの作成もして読み込みも終わりましたので、後は値の保存だけです。

先ほど作成したModelをインスタンス化し、saveメソッドを実行することで、フィールドで保持している値がSharedPreferencesに保存されます。

AppStatus appStatus = new AppStatus();
appStatus.appName = "Garum";
appStatus.startupCount = ++appStatus.startupCount;
appStatus.showNotification = true;
appStatus.save();

saveメソッドを実行することで、以下の場所にXMLが作られ、フィールドの値が書き出されます。

/data/data/[package name]/shared_prefs/app_status.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="appName">Garum</string>
    <int name="startupCount" value="1" />
    <boolean name="showNotification" value="true" />
</map>

Model

SharedPreferencesXML
AppStatus appStatus = new AppStatus();
if(appStatus.showNotification){
    // Notificationを出す処理...とかとか
}

Type Serializerのサポート

通常のSharedPreferencesではサポートされていない型を保存できるような仕組みを提供しています。

クラス Deserialize Serialize
DateSerializer java.util.Date Long
CalendarSerializer Calendar Long
FileSerializer File String
UriSerializer Uri String

Modelの作成時に、Deserializeの型のフィールドを定義することで使用することができます。

@Pref(name = "user_status")
public class UseStatus extends PrefModel {

    @PrefKey("last_used")
    public Date lastUsed;

    @PrefKey
    public Calendar birthday;

    @PrefKey("tmp_file")
    public File tmpFile;

    @PrefKey("uri")
    public Uri id_uri;
}

save

使

Serialize/Deserialize使 
UseStatus useStatus = new UseStatus();
useStatus.lastUsed = new Date();
useStatus.birthday = Calendar.getInstance();
useStatus.tmpFile = new File("tmp.txt");
useStatus.id_uri = Uri.parse("content://com.os.operando.sample/users/1");
useStatus.save();

SerializerTypeSerializer使

SharedPreferencesSerialize

Github

https://github.com/operando/Garum/tree/master/garum/src/main/java/com/os/operando/garum/serializers

Garum


SharedPreferences

UtilKey

GarumGarum




使SharedPreferences使Garum

PreferenceFragment

containsKeycontainsKey

remove

@Default...valueredIdredId






Garum使PR



SharedPreferencesAndroid
58
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

58
55