why realm?

48
Realm The Finest Artist

Upload: leonardo-taehwan-kim

Post on 22-Jan-2018

1.307 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Why realm?

RealmThe Finest Artist

Page 2: Why realm?

Realm [Relm]

Page 3: Why realm?

렘 [레엠]

Page 4: Why realm?

Realm = Kingdom

Page 5: Why realm?

Realm = Mobile Database

Page 6: Why realm?

Realm

Replacement for SQLite & Core Data

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

Java, Kotlin, Objective-C, Swift

Page 7: Why realm?

Why Realm?

Page 8: Why realm?

RealmVery Fast

ORM like models & queries

RealmResults auto refresh

More features…

Open source

Documentation in Korean

Page 9: Why realm?

How Fast?

Page 10: Why realm?
Page 11: Why realm?
Page 12: Why realm?
Page 13: Why realm?

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

Page 14: Why realm?

ORM like models & queries

Page 15: Why realm?

Modelpublic class User extends RealmObject {

@PrimaryKey private String name; private int age;

@Ignore private int sessionId;

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

Page 16: Why realm?

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

Page 17: Why realm?

Write

realm.beginTransaction();

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

user.setName("John");

user.setEmail("[email protected]");

realm.commitTransaction();

Page 18: Why realm?

Write

User user = new User("John");

user.setEmail("[email protected]");

realm.beginTransaction();

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

realm.copyToRealmOrUpdate(user);

realm.commitTransaction();

Page 19: Why realm?

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

Page 20: Why realm?

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

Page 21: Why realm?

RealmResults Auto-refresh

Page 22: Why realm?

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

Page 23: Why realm?

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); /*...*/ } }

Page 24: Why realm?

More Features

Page 25: Why realm?

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

Listeners Migration

Realm Browser (Mac OS)

Page 26: Why realm?

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

Page 27: Why realm?

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

Page 28: Why realm?

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

Page 29: Why realm?

Realm Browser

Page 30: Why realm?

Open Source

Page 31: Why realm?

Documentation in Korean

Page 32: Why realm?

Current LimitationsRealmObject

Only private field Only default getter & setter

Static field & method are allowed Null Values

Threads

Page 33: Why realm?

Users

Page 34: Why realm?

More

Homepage: http://realm.io/

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

Email: [email protected]

Page 35: Why realm?

Use CaseInstagRealm

https://github.com/TheFinestArtist/InstagRealm

Page 36: Why realm?

InstagRealm

Page 37: Why realm?

FeaturesInstagram Tag API

ScrollView, ListView, RecyclerView, CardView

Infinite Scroll (Paging), Swipe to Refresh

Retrofit

Gson

EventBus

Royal

Fresco, Butterknife, RecyclerView-Animator, Logger

Page 38: Why realm?

Flow

Retrofit (Instagram Tag API)

=> Gson (Serialize)

=> Realm (Insert data)

=> EventBus

=> Update UI & Notify Adpater

Page 39: Why realm?

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

Page 40: Why realm?

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!"); } }); }

Page 41: Why realm?

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

Page 42: Why realm?

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

Page 43: Why realm?

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

Page 44: Why realm?

Use CaseInstagRealm

https://github.com/TheFinestArtist/InstagRealm

Page 45: Why realm?
Page 46: Why realm?
Page 47: Why realm?

Thank You :)

Page 48: Why realm?

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