Skip to content

kobakei/spot

Repository files navigation

Spot

Build Status JitPack Android Arsenal

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.

Download

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'
}

LATEST_VERSION is JitPack

NOTE: if you use Android Gradle Plugin before 2.2.0, you must use android-apt plugin instead of annotationProcessor configuration.

Basic usage

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);

Type converter

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();
}

Kotlin

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
}

Migration from 1.0.0 or older versions

  • 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;  

Contribute this project

Small bug fixes are welcomed. If you want to add new feature, please raise issue.

License

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.