Spot (SharedPreferences Object Transformer) is Android object-data mapper for SharedPreferences.
Main features are as below:
- No reflection: All repository classes will be generated by annotation processing.
- POJO support: Entity classes do not need to inherit base class.
- Store any types: By providing TypeConverter, any types can be stored.
Project build.gradle
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}App build.gradle
dependencies {
...
annotationProcessor 'com.github.kobakei.spot:compiler:LATEST_VERSION'
compile 'com.github.kobakei.spot:library:LATEST_VERSION'
}NOTE: if you use Android Gradle Plugin before 2.2.0, you must use android-apt plugin instead of annotationProcessor configuration.
Annotate your entity class with @Pref and fields with @PrefField.
@Pref(name = "foo")
public class MyEntity {
// Integer field
// defaultValue can be omitted.
@PrefField(name = "hoge")
public int hoge = 123;
// String field
// defaultValue can be omitted.
@PrefField(name = "fuga")
public String fuga = "Hello";
// Default constructor is needed.
public MyEntity() {}
}Once your build, MyEntitySpotRepository class will be generated in same package as entity class.
// Get
MyEntity entity = MyEntitySpotRepository.getEntity(context);
// Put
entity.hoge = 123;
entity.fuga = "Goodbye"
MyEntitySpotRepository.putEntity(context, entity);Spot supports 6 types (int, long, float, boolean, String and Set<String>) as fields but other types can also be supported by providing TypeConverter class.
For example, let's support java.util.Date class as entity field.
At first, subclass of TypeConverter is needed. The follow sample gets/puts Date value from SharedPreferences by converting from/to Long.
public class DateTypeConverter extends TypeConverter<Date, Long> {
@Override
public Date convertFromSupportedType(Long t) {
return new Date(t);
}
@Override
public Long convertToSupportedType(Date t) {
return t.getTime();
}
}At last, annotate Date field with converter option.
@Pref(name = "foo")
public class MyEntity {
@PrefField(name = "date", converter = DateTypeConverter.class)
public Date date = new Date();
}To work with Kotlin, please set true to useSetter and useGetter option.
@Pref(name = "MyModel")
data class MyModel {
@PrefField(name = "foo", useSetter = true, useGetter = true)
var foo: Int = 0
}- Replace
@Pref***with@PrefFielddefaultValueis deprecated at v2 therefore put default value to field init value.
// Before // @PrefInt(name = "foo", defaultValue = 123) // public int foo; // After @PrefField(name = "foo") public int foo = 123;
Small bug fixes are welcomed. If you want to add new feature, please raise issue.
Copyright 2016 Keisuke Kobayashi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.