Slide 1

Slide 1 text

Realm meetup #19 [email protected]

Slide 2

Slide 2 text

#realm_jp [email protected]

Slide 3

Slide 3 text

Makoto Yamazaki Realm Inc. / uPhyca Inc. [email protected]

Slide 4

Slide 4 text

Realm CoreΛ׬શެ։ [email protected]

Slide 5

Slide 5 text

Realm CoreϓϩδΣΫτ [email protected] https://github.com/realm/realm-core

Slide 6

Slide 6 text

Ϗϧυํ๏ [email protected] how-to-build.md ࢀর • Ubuntu 10.04, 12.04, 13.04, 13.10, 14.04 • Linux Mint 15, 16, 17, 17.1 • Fedora 17, 18, 19, 20 • Amazon Linux 2012.09 • OS X 10.10 and 10.11

Slide 7

Slide 7 text

Ϗϧυํ๏ [email protected] how-to-build.md ࢀর # ڞ௨ $ sh build.sh config $ sh build.sh build $ sh build.sh test # iOS $ sh build.sh build-ios # watchOS $ sh build.sh build-watchos # tvOS $ sh build.sh build-tvos # Android $ sh build.sh build-android

Slide 8

Slide 8 text

ϑΝΠϧߏ੒ [email protected] src/realm test/ doc/ ओʹݟΔ΂͖͸ҎԼͷσΟϨΫτϦ

Slide 9

Slide 9 text

ϔομϑΝΠϧ [email protected] /// The Table class is non-polymorphic, that is, it has no virtual
 /// functions. This is important because it ensures that there is no run-time
 /// distinction between a Table instance and an instance of any variation of
 /// BasicTable, and this, in turn, makes it valid to cast a pointer from
 /// Table to BasicTable even when the instance is constructed as a Table. Of
 /// course, this also assumes that BasicTable<> is non-polymorphic, has no
 /// destructor, and adds no extra data members.
 ///
 /// FIXME: Table assignment (from any group to any group) could be made aliasing
 /// safe as follows: Start by cloning source table into target allocator. On
 /// success, assign, and then deallocate any previous structure at the target.
 ///
 /// FIXME: It might be desirable to have a 'table move' feature between two
 /// places inside the same group (say from a subtable or a mixed column to group
 /// level). This could be done in a very efficient manner.
 ///
 /// FIXME: When compiling in debug mode, all public non-static table functions
 /// should REALM_ASSERT(is_attached()).
 class Table {
 public:
 /// Construct a new freestanding top-level table with static
 /// lifetime.
 ///
 /// This constructor should be used only when placing a table
 /// instance on the stack, and it is then the responsibility of
 /// the application that there are no objects of type TableRef or
 /// ConstTableRef that refer to it, or to any of its subtables,
 /// when it goes out of scope. To create a top-level table with
 /// dynamic lifetime, use Table::create() instead.
 Table(Allocator& = Allocator::get_default());
 
 /// Construct a copy of the specified table as a new freestanding
 /// top-level table with static lifetime.
 ///
 /// This constructor should be used only when placing a table
 /// instance on the stack, and it is then the responsibility of
 /// the application that there are no objects of type TableRef or
 /// ConstTableRef that refer to it, or to any of its subtables,
 /// when it goes out of scope. To create a top-level table with
 /// dynamic lifetime, use Table::copy() instead.
 Table(const Table&, Allocator& = Allocator::get_default());
 ͓קΊϔομϑΝΠϧ group.hpp group_shared.hpp table.hpp string_data.hpp index_string.hpp query_expression.hpp

Slide 10

Slide 10 text

star & PR͓଴͍ͪͯ͠·͢ [email protected] CONTRIBUTING.md doc/development/coding_style_guide.cpp

Slide 11

Slide 11 text

Recent Updates [email protected]

Slide 12

Slide 12 text

Realm Java 2.0.0 (was 1.2.0) [email protected]

Slide 13

Slide 13 text

Realm Java 2.0.0(৽ػೳ) • Realm Mobile PlatformରԠʂʂʂʢϕʔλʣ • άϩʔόϧॳظԽϝιουRealm.init(Context)Λಋೖ • ॳظԽϝιουҎ֎Ͱ͸Context͕ෆཁʹ • RealmLogΫϥεʹΑΔϩά੍ޚ • ϞσϧΫϥεͰΦϒδΣΫτͷॳظ஋ΛఆٛՄೳʹ • isManaged()ϝιουΛ௥Ճ [email protected]

Slide 14

Slide 14 text

Realm Java 2.0.0(όάमਖ਼) • ϞσϧΫϥεͷίϯετϥΫλ಺ͰɺଞͷϞσϧΫϥεͷϑΟʔϧυΞ Ϋηε͕ਖ਼͘͠ಈ࡞͠ͳ͍όάΛमਖ਼(#3361) • ϞσϧͷίϯετϥΫλ͔Βsetter/getterΛݺͿͱNPE͕ൃੜ͢Δόά Λमਖ਼(#2536) • ଞͷϓϩδΣΫτͰॻ͖׵͑ࡁΈͷϞσϧΫϥεΛ࠶౓ॻ͖׵͑Α͏͠ ͯΤϥʔ͕ൃੜ͢ΔόάΛमਖ਼(#3469) [email protected]

Slide 15

Slide 15 text

Realm Java 2.0.0(ඇޓ׵ͷมߋ1) • ϑΝΠϧͷϑΥʔϚοτ͕มߋʹͳ͍ͬͯ·͢(ࣗಈతʹม׵) • ͸͡ΊʹඞͣRealm.init(Context)ΛݺΜͰ͍ͩ͘͞(Application౳Ͱ) • Ҿ͖਺ʹContextΛऔΔίϯετϥΫλ/ϝιου͸Context͕ͳ͍΋ͷΛ࢖ͬͯͩ͘ ͍͞ • ΞϯϚωʔδυͳRealmObjectͷisValid()͸ৗʹtrueΛฦ͢Α͏ʹͳΓ·ͨ͠(ଞͷϓ ϥοτϑΥʔϜͱͷޓ׵ੑ) • armeabiͷόΠφϦΛ࡟আ͠·ͨ͠(෮׆ͷՄೳੑ͋Γ #3508) • IncompatibleLockFileException ͱRealmIOExcpetion ͕ഇࢭ͞ΕɺRealmFileException Ͱஔ͖׵͑ΒΕ·ͨ͠ [email protected]

Slide 16

Slide 16 text

Realm Java 2.0.0(ඇޓ׵ͷมߋ2) • ϓϥΠϚϦΩʔ͕ఆٛ͞ΕͨΫϥεΛRealm.createObject()Ͱ࡞੒͢Δ৔ ߹ɺRealm.createObject(Class)Ͱ͸ͳ͘Realm.createObject(Class,Object) Λ࢖͍ͬͯͩ͘͞ • JSON͔ΒΠϯϙʔτ͢ΔࡍɺϓϥΠϚϦΩʔ͕ఆٛ͞Ε͍ͯΔʹ΋ؔΘ ΒͣJSON ্ʹଘࡏ͠ͳ͍৔߹͸ྫ֎͕εϩʔ͞Ε·͢ • ϓϥΠϚϦΩʔͷ஋͸มߋෆՄʹͳΓ·ͨ͠ • Realm.create*FromJson()͸ɺϞσϧΫϥεͷϑΟʔϧυ΍ίϯετϥΫλ Ͱఆٛ͞Εͨॳظ஋Λ൓ө͢ΔΑ͏ʹͳΓ·ͨ͠ [email protected]

Slide 17

Slide 17 text

Realm Mobile PlatformରԠ [email protected] realm { syncEnabled = true } appͷbuild.gradeʹ ৄࡉ͸ bit.ly/RMP_JAVA

Slide 18

Slide 18 text

Realm Mobile PlatformରԠ [email protected] Credentials creds = Credentials.usernamePassword(username, password, true);
 User.loginAsync(creds, "https://realm.example.com:9443", new User.Callback() {
 @Override
 public void onSuccess(User user) { // ログイン成功時の処理 }
 
 @Override
 public void onError(ObjectServerError error) {
 // エラー処理
 }
 } );

Slide 19

Slide 19 text

Realm Mobile PlatformରԠ [email protected] // ユーザーとURLから設定を作成
 SyncConfiguration config = new SyncConfiguration.Builder(user,
 "realm://realm.example.com/~/userRealm").build();
 
 // 同期されるRealm
 Realm realm = Realm.getInstance(config);

Slide 20

Slide 20 text

Realm Mobile PlatformରԠ [email protected] https://github.com/realm/RealmTasks ͷ RealmTasks Android ʹαϯϓϧ͕͋Γ·͢

Slide 21

Slide 21 text

Realm.init(Context)ͷಋೖ [email protected] public class MyApplication extends Application {
 @Override
 public void onCreate() {
 super.onCreate();
 
 Realm.init(this);
 
 // その他の初期化
 }
 }

Slide 22

Slide 22 text

RealmLogΫϥε [email protected] // すべてのロガーを削除 RealmLog.clear(); // 独自のロガーを追加
 RealmLog.add(new AndroidLogger(Log.DEBUG));

Slide 23

Slide 23 text

ϞσϧΫϥεͷॳظ஋ [email protected] public class User extends RealmObject {
 @PrimaryKey
 @Required
 public String id = UUID.randomUUID().toString();
 public String name;
 public int age;
 
 public User() {
 this.name = "unknown";
 }
 } String id = UUID.randomUUID().toString();
 User user = realm.createObject(User.class, id);
 print(user.id); // createObjectに渡したidの値
 print(user.name); // "unknown"

Slide 24

Slide 24 text

ϞσϧΫϥεͷॳظ஋ [email protected] public class Owner extends RealmObject {
 public String name;
 public User user = new User();
 } Owner owner = realm.createObject(Owner.class);
 print(owner.user.id); // モデルクラスが生成したランダムなID

Slide 25

Slide 25 text

ίϯετϥΫλབྷΈͷόάमਖ਼ [email protected] public class User extends RealmObject {
 public String name;
 public int age;
 
 public User() {}
 
 public User(User user) {
 this.name = user.name; 
 setAge(20);
 }
 
 public void setAge(int age) {
 this.age = age;
 }
 } NullPointerException user͕Ϛωʔδυͷ৔߹ৗʹ0

Slide 26

Slide 26 text

[email protected] realm.where(Foo.class).equalTo(FooFields.AGE, 20); realm.where(Foo.class).equalTo("age", 20) http://bit.ly/RealmField realm.where(Foo::class.java).equalTo(Foo::age.name, 20); Kotlinͷਓ͸ݩʑҎԼͷΑ͏ʹॻ͚ΔͷͰෆཁͰ͢ Realm Field Names Helper

Slide 27

Slide 27 text

Ξϯέʔτͷճ౴Λ͓ئ͍͠·͢ [email protected] http://bit.ly/RealmJP_19