Android ORM

Mapowanie relacyjno obiektowe w androidzie na przykładzie bazy danych Realm.


 
 
 
 
 

Realm

 

Witaj w androidzie istnieją inne bazy danych nie tylko SQLite 🙂 co więcej mamy możliwość mapowania naszych obiektów na tabele w bazie. Podobnie jak Hibernate. Pokażę Ci dzisiaj na przykładzie bazy Realm jak można wykorzystać orm w Androidzie. Na początek dodajemy baze do naszego projektu. Gradle Project:

 

dependencies {
       classpath "io.realm:realm-gradle-plugin:3.3.1"
}

 

Gradle Module:

 

apply plugin: 'realm-android'

 

Następnie tworzymy model danych na których będzie operować nasza aplikacja zawsze jest Task niech będzie Item:). Nasz model musi dziedziczyć po klasie RealmObject możemy używać adnotacji.

 

public class Item extends RealmObject {

    @PrimaryKey
    private int id;
    private String name;
    private String description;
    private byte[] image;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

 

DAO

 

Następnie tworzymy klasę ItemDAO gdzie będziemy wykonywać wszystkie operacje typu CRUD na naszej bazie a nie napiszemy żadnej lini SQL’a:). Na początek w konstruktorze inicjalizujemy bazę, a potem już z górki działamy jak na obiektach, gdy zmieniamy coś w bazie najpierw rozpocznynamy transakcje a na koniec robimy commit, gdy wykonujemy operację typu delete wykonujemy transakcje. Minusem Realm’a jest to, że nie obsługuje autoincrementa, ale można sobie z tym poradzić np metodą podobną do generateId().

 

public class ItemDAO {

    private Realm realm;

    public ItemDAO(Context context) {

        Realm.init(context);

        RealmConfiguration config = new RealmConfiguration.
                Builder().
                deleteRealmIfMigrationNeeded().
                build();
        Realm.setDefaultConfiguration(config);

        realm = Realm.getInstance(config);
    }

    public void insertItem(Item item) {

        realm.beginTransaction();

        item.setId(generateId());
        Item itemRealm = realm.createObject(Item.class, item.getId());
        itemRealm.setName(item.getName());
        itemRealm.setDescription(item.getDescription());
        itemRealm.setImage(item.getImage());

        realm.commitTransaction();
    }

    public Item getItemById(int id) {

        Item itemRealm = realm.where(Item.class).equalTo("id", id).findFirst();

        return itemRealm;
    }

    public void updateItem(Item item) {

        Item itemRealm = realm.where(Item.class).equalTo("id", item.getId()).findFirst();
        realm.beginTransaction();
        itemRealm.setName(item.getName());
        realm.commitTransaction();
    }

    public void deleteItemById(final long id) {

        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.where(Item.class).equalTo("id", id).findFirst().deleteFromRealm();
            }
        });
    }

    public List<Item> getAllItems() {
        List<Item> items = new ArrayList<>();

        RealmResults<Item> all = realm.where(Item.class).findAll();

        for (Item itemRealm : all) {
            items.add(itemRealm);
        }
        return items;
    }

    public void close() {
        realm.close();
    }

    private int generateId() {
        if (realm.where(Item.class).max("id") == null)
            return 1;
        else
            return realm.where(Item.class).max("id").intValue() + 1;
    }
}

 
Praca na mapowanych obiektach jest dosyć przyjemne:). W aktywności poprostu operujemy na obiekcie ItemDAO.

Have Fun:)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *