why realm?

Post on 22-Jan-2018

1.306 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

RealmThe Finest Artist

Realm [Relm]

렘 [레엠]

Realm = Kingdom

Realm = Mobile Database

Realm

Replacement for SQLite & Core Data

Android, Android Wear, iOS, OS X, Watch OS

Java, Kotlin, Objective-C, Swift

Why Realm?

RealmVery Fast

ORM like models & queries

RealmResults auto refresh

More features…

Open source

Documentation in Korean

How Fast?

Gson vs Realm

This test is to compare the speed of Gson and Realm with an extremely simple object model. The overall result of the test shows that Realm performs a little faster than Gson. However, it could show different results in other test conditions. Refer to the appendix for further information.

Gson.toJson

Gson.fromJson

Realm.createObject

copyToRealm

Milisecond

0 300 600 900 1200

ORM like models & queries

Modelpublic class User extends RealmObject {

@PrimaryKey private String name; private int age;

@Ignore private int sessionId;

// + Standard getters & setters generated by your IDE }

Relationpublic class Email extends RealmObject { private String address; private boolean active; }

// Many to One public class Contact extends RealmObject { private Email email; }

// Many to Many public class Contact extends RealmObject { private RealmList<Email> emails; }

Write

realm.beginTransaction();

User user = realm.createObject(User.class); // Create a new object

user.setName("John");

user.setEmail("john@corporation.com");

realm.commitTransaction();

Write

User user = new User("John");

user.setEmail("john@corporation.com");

realm.beginTransaction();

realm.copyToRealm(user); // Copy the object to Realm.

realm.copyToRealmOrUpdate(user);

realm.commitTransaction();

Query// Fluent interface RealmResults<User> result = realm.where(User.class) .sort("age"); .beginGroup() .equalTo("name", "John") .or() .equalTo("name", "Peter") .endGroup() .findAll();

for (User user : result) { // do something... }

Query Options// Conditions between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo() equalTo() & notEqualTo() contains(), beginsWith() & endsWith() isNull() & isNotNull() beginsWith() & endsWith() & contains()

// Conditions Grouping beginGroup() & endGroup() & not() & or()

// Sorting RealmResults<User> result = realm.where(User.class).findAll(); result.sort("age", RealmResults.SORT_ORDER_DESCENDING);

// Querying findAll() & findFirst() & findAllSorted()

RealmResults Auto-refresh

RealmResultspublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

RealmResults<Post> realmResults;

public RecyclerViewAdapter(Realm realm) { realmResults = realm.where(Post.class).findAll(); }

@Override public int getItemCount() { return realmResults.size(); }

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false); return new ViewHolder(view); }

@Override public void onBindViewHolder(ViewHolder holder, int position) { Post post = realmResults.get(position); // do something... } }

RealmResultspublic class UserRecyclerAdapter extends RecyclerView.Adapter<ChatRecyclerAdapter.ViewHolder> {

List<User> users;

public ChatRecyclerAdapter() { /*...*/ }

public void setUsers(List<User> users) { this.users = users; }

@Override public int getItemCount() { return users == null ? 0 : users.size(); }

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false); return new ViewHolder(view); }

@Override public void onBindViewHolder(ViewHolder holder, int position) { User user = users.get(position); /*...*/ } }

More Features

More FeaturesEncryption (AES-256) Multiple Databases In-Memory Realm

Listeners Migration

Realm Browser (Mac OS)

Realm ConfigurationRealmConfiguration config1 = new RealmConfiguration.Builder(context) .name("myrealm1.realm") .encryptionKey(getKey1()) .schemaVersion(1) .setModules(new MySchemaModule1()) .migration(new MyMigration1()) .build();

RealmConfiguration config2 = new RealmConfiguration.Builder(context) .name("myrealm2.realm") .encryptionKey(null) .inMemory() .schemaVersion(2) .setModules(new MySchemaModule2()) .migration(new MyMigration2()) .build();

Realm Listener private RealmChangeListener realmListener;

@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); realmListener = new RealmChangeListener() { @Override public void onChange() { // ... do something with the updates (UI, etc.) ... } };

realm.addChangeListener(realmListener); }

@Override public void onDestroy() { super.onDestroy(); realm.removeChangeListener(realmListener); }

Realm Migrationpublic class Migration implements RealmMigration { @Override public long execute(Realm realm, long version) { // Migrate from version 0 to version 1 if (version == 0) { Table personTable = realm.getTable(Person.class);

long fistNameIndex = getIndexForProperty(personTable, "firstName"); long lastNameIndex = getIndexForProperty(personTable, "lastName"); long fullNameIndex = personTable.addColumn(ColumnType.STRING, "fullName"); personTable.removeColumn(getIndexForProperty(personTable, "firstName")); personTable.removeColumn(getIndexForProperty(personTable, "lastName")); version++; } return version; } }

https://github.com/realm/realm-java/blob/master/examples/migrationExample

Realm Browser

Open Source

Documentation in Korean

Current LimitationsRealmObject

Only private field Only default getter & setter

Static field & method are allowed Null Values

Threads

Users

More

Homepage: http://realm.io/

Facebook: http://fb.com/groups/realmkr

Email: kr@realm.io

Use CaseInstagRealm

https://github.com/TheFinestArtist/InstagRealm

InstagRealm

FeaturesInstagram Tag API

ScrollView, ListView, RecyclerView, CardView

Infinite Scroll (Paging), Swipe to Refresh

Retrofit

Gson

EventBus

Royal

Fresco, Butterknife, RecyclerView-Animator, Logger

Flow

Retrofit (Instagram Tag API)

=> Gson (Serialize)

=> Realm (Insert data)

=> EventBus

=> Update UI & Notify Adpater

RestAdapterprivate static Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); }

@Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }) .create();

private static RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(END_POINT) .setConverter(new GsonConverter(gson)) .setRequestInterceptor(requestInterceptor) .build();

private static InstagramService instagramService = restAdapter.create(InstagramService.class);

Instagram APIpublic static void getTag(final Activity activity, final Class<? extends RoyalDatabase> clazz, String next) { instagramService.getTags("art", accessToken, next, new Callback<TagsCallback>() { @Override public void success(TagsCallback tagsCallback, Response response) { RoyalTransaction.save(clazz, tagsCallback.data); if (ScrollViewDatabase.class.equals(clazz)) EventBus.getDefault().post(new OnScrollViewUpdateEvent(tagsCallback.pagination.next_max_tag_id, tagsCallback.data)); if (ListViewDatabase.class.equals(clazz)) EventBus.getDefault().post(new OnListViewUpdateEvent(tagsCallback.pagination.next_max_tag_id)); if (RecyclerViewDatabase.class.equals(clazz)) EventBus.getDefault().post(new OnRecyclerViewUpdateEvent(tagsCallback.pagination.next_max_tag_id)); if (CardViewDatabase.class.equals(clazz)) EventBus.getDefault().post(new OnCardViewUpdateEvent(tagsCallback.pagination.next_max_tag_id)); } @Override public void failure(RetrofitError error) { SnackBar.alert(activity, "Please check your network status!"); } }); }

OnEventint itemCount = 0;

public void onEvent(OnRecyclerViewUpdateEvent event) { swipeRefreshLayout.setRefreshing(false); if (event.isFailed()) return;

next = event.getNext();

if (itemCount < adapter.getItemCount()) adapter.notifyItemRangeInserted(itemCount, adapter.getItemCount() - itemCount); else adapter.notifyItemRangeRemoved(itemCount, itemCount - adapter.getItemCount());

itemCount = adapter.getItemCount(); }

RecyclerViewAdapterpublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

RealmResults<Post> realmResults;

public RecyclerViewAdapter(Realm realm) { realmResults = realm.where(Post.class).findAll(); }

@Override public int getItemCount() { return realmResults.size(); }

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false); return new ViewHolder(view); }

@Override public void onBindViewHolder(ViewHolder holder, int position) { Post post = realmResults.get(position); // do something... } }

ListViewAdapterpublic class ListViewAdapter extends RealmBaseAdapter<Post> implements ListAdapter {

public ListViewAdapter(Context context, RealmResults<Post> realmResults) { super(context, realmResults, true); }

static class ViewHolder { ViewHolder(View view) { /*...*/ } public void setPost(Post post) { /*...*/ } }

@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; /* ViewHolder Inflating */ Post post = realmResults.get(position); viewHolder.setPost(post); return convertView; } }

Use CaseInstagRealm

https://github.com/TheFinestArtist/InstagRealm

Thank You :)

AppendixTest Device: Galaxy S3 Test Model public class Contact { public String address; public String number; public boolean active; }

10000 times iteration per each test. 5 times test per each method Test Code: https://github.com/Test-Codes/Realm-Java-Benchmark

top related