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@PrefField
defaultValue
is 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.