why realm?
Post on 22-Jan-2018
1.306 Views
Preview:
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