KVS Schema is a library to manage key-value data for Android. This library generates accessor methods of SharedPreferences from schema class in compile time.
Let's say you will store user id, You have to create a schema class like below.
@Table(name = "example")
public class ExamplePrefsSchema {
@Key(name = "user_id") int userId;
}
Class name should be *Schema
.
KVS Schema generates ExamplePrefs
from ExamplePrefsSchema
. You can use generated accessors below.
ExamplePrefs prefs = ExamplePrefs.get(context);
prefs.putUserId(userId);
prefs.putUserId(userId, defaultValue);
prefs.getUserId();
prefs.hasUserId();
prefs.removeUserId();
KVS supports boolean
String
float
int
long
String
set
.
You can specify default values for the case of that a given key doesn't be contained in a SharedPreferences.
prefs.getUserId(defaultValue);
You can also specify default values through a schema class. KVS Schema can read right values that become a constant in compile time.
@Table(name = "example")
public abstract class ExamplePrefsSchema {
@Key(name = "user_id") final int userId = -1;
}
Using the mechanism, you don't have to specify default values when you set right values that is a final field initialized to a compile time constant.
Sometimes you want to put model classes into SharedPreferences. For that cases, KVS Schema can store data using serializer class.
// Schema class
@Table(name = "example")
public abstract class ExamplePrefsSchema {
@Key(name = "user", serializer = UserPrefsSerializer.class) String user;
}
// Serializer class
public class UserSerializer implements PrefsSerializer<User, String> {
@Override public String serialize(User src) { return GSON.toJson(src); }
@Override public User deserialize(String src) { return GSON.fromJson(src, User.class); }
}
// Usage
prefs.putUser(user);
You can specify builder class to use custom SharedPreferences.
// Schema class
@Table(name = "example", builder = ExamplePrefsBuilder.class)
public abstract class ExamplePrefsSchema {
@Key(name = "user_id") int userId;
}
// Builder class
public class ExamplePrefsBuilder implements PrefsBuilder<ExamplePrefs> {
@Override
public ExamplePrefs build(Context context) {
...
return new ExamplePrefs(...); // You can pass your SharedPreferences here
}
}
KVS Schema generates set*
method as an alias of put*
to utilize property syntax of Kotlin. So you can read/write values like below when you use Kotlin.
prefs.userId = "Kotlin"
prefs.userId // => Kotlin
Add dependencies to your build.gradle.
annotationProcessor 'com.rejasupotaro:kvs-schema-compiler:5.1.0'
compile 'com.rejasupotaro:kvs-schema:5.1.0'
Even if you have already used SharedPreferences directly in your existing app, migration is easy. KVS Schema simply maps the structure of SharedPreferences.
For example, if you are using default SharedPreferences like below,
prefs = PreferenceManager.getDefaultSharedPreferences(this);
Editor editor = prefs.edit();
editor.putString("user_id", "1");
editor.putString("user_name", "Smith");
editor.apply();
your data is saved on path/to/app/shared_prefs/package_name_preferences.xml
. The schema class becomes like below.
@Table(name = "package_name_preferences")
public abstract class ExamplePrefsSchema {
@Key(name = "user_id") int userId;
@Key(name = "user_name") String userName;
}