Freezer - 一個簡單的&流暢 Android ORM

jopen 8年前發布 | 13K 次閱讀 Freezer Android開發 移動開發

Freezer

logo freezer

Freezer - 一個簡單的&流暢 Android ORM 。使用注釋標記被持久化類:

@Model
public class User {
    int age;
    String name;
    Cat cat;
    List<Dog> dogs;
}
@Model
public class Dog {
    String name;
}
@Model
public class Cat {
    String shortName;
}

Persist datas

Persist your data easily:

UserEntityManager userEntityManager = new UserEntityManager();

User user = ... // Create a new object userEntityManager.add(user);</pre> </div>

Querying

Freezer query engine uses a fluent interface to construct multi-clause queries.

Simple

To find all users:

List<User> allUsers = userEntityManager.select()
                             .asList();

To find the first user who is 3 years old:

User user3 = userEntityManager.select()
                    .age().equalsTo(3)
                    .first();

Complex

To find all users

  • with name "Florent"
  • or who own a cat with shortNamed "Java"
  • or who own a dog named "Sasha"

you would write:

List<User> allUsers = userEntityManager.select()
                                .name().equalsTo("Florent")
                             .or()
                                .cat(CatEntityManager.where().shortName().equalsTo("Java"))
                             .or()
                                .dogs(DogEntityManager.where().name().equalsTo("Sasha"))
                             .asList();

Selectors

//strings
     .name().equalsTo("florent")
     .name().notEqualsTo("kevin")
     .name().contains("flo")
//numbers
     .age().equalsTo(10)
     .age().notEqualsTo(30)
     .age().greatherThan(5)
     .age().between(10,20)
//booleans
     .hacker().equalsTo(true)
     .hacker().isTrue()
     .hacker().isFalse()

Aggregation

The QueryBuilder offers various aggregation methods:

float agesSum      = userEntityManager.select().sum(UserColumns.age);
float agesAverage  = userEntityManager.select().average(UserColumns.age);
float ageMin       = userEntityManager.select().min(UserColumns.age);
float ageMax       = userEntityManager.select().max(UserColumns.age);
int count          = userEntityManager.select().count();

Entities

Freezer makes it possible, yes you can design your entities as your wish:

@Model
public class MyEntity {

    // primitives
    [ int / float / boolean / String / long / double ] field;

    // arrays
    [ int[] / float[] / boolean[] / String[] / long[] / double ] array; 

    // collections
    [ List<Integer> / List<Float> / List<Boolean> / List<String> / List<Long> / List<Double> ] collection;

    // One To One
    MySecondEntity child;

    // One To Many
    List<MySecondEntity> childs;
}

Logging

You can log all SQL queries from entities managers:

userEntityManager.logQueries((query, datas) -> Log.d(TAG, query) }

It's always better with a context

Don't forget to initialise Freezer in your application:

public class MyApplication extends Application {

    @Override public void onCreate() {
        super.onCreate();
        Freezer.onCreate(this);
    }

}

Migration

To handle schema migration, just add @Migration(newVersion) in a static method, then describe the modifications:

public class DatabaseMigration {

    @Migration(2)
    public static void migrateTo2(Migrator migrator) {
        migrator.update("User")
                .removeField("age")
                .renameTo("Man");
    }

    @Migration(3)
    public static void migrateTo3(Migrator migrator) {
        migrator.update("Man")
                .addField("birth", ColumnType.Primitive.Int);
    }

    @Migration(4)
    public static void migrateTo4(Migrator migrator) {
        migrator.addTable(migrator.createModel("Woman")
                .field("name", ColumnType.Primitive.String)
                .build());
    }
}

Migration isn't yet capable of:

  • changing type of field
  • adding/modifying One To One
  • adding/modifying One To Many
  • handling collections/arrays

TODO

  • Update an entry
  • Improve migration
  • Add some selectors operations (like, ...)
  • Add Observable support
  • Provide an Asynchronous API
  • Add @Ignore annotation
  • Add unit tests

Changelog

1.0.1

Introduced Migration Engine.

1.0.2

  • Support long & double
  • Support arrays
  • Improved QueryBuilder
  • Refactored cursors helpers
  • </ul>

    A project initiated by Xebia

    This project was first developed by Xebia and has been open-sourced since. We will continue working on it. We encourage the community to contribute to the project by opening tickets and/or pull requests.

    logo xebia

    Download

    Download

    buildscript {
      dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      }
    }

    apply plugin: 'com.neenbedankt.android-apt'

    dependencies { compile 'fr.xebia.android.freezer:freezer:1.0.2' provided 'fr.xebia.android.freezer:freezer-annotations:1.0.2' apt 'fr.xebia.android.freezer:freezer-compiler:1.0.2' }</pre> </div>

    License

    Copyright 2015 Xebia, Inc.

    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.</pre>

    項目地址: https://github.com/florent37/Freezer

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!