Upload
yu-sugawara
View
125
Download
1
Embed Size (px)
Citation preview
軽量・高速モバイルデータベースRealm入門を使って学ぶRealmの勘所DevSap勉強会 17/03/26
菅原 祐@yusuga_
Aplos for Twitter
Realmの本を書きました!
軽量•高速モバイルデ ー タベ ー ス
Re�alm 入門
菅原祐蕃
Realm岸川克己監修
「Swift」と「 Realm Mobile Database」
によるiOSアプリ開発を
徹底解説!区モバイルデー タペ ースを使ったことがない方
図「SQ Lite」や「Core Data」から置き換えたい方
区より実践的な使用方法を知りたい方
にオススメ!
授術評編社
本日のテーマ
本日のテーマ1.軽量・高速モバイルデータベースRealm入門を使って学ぶRealmの勘所
本日のテーマ1.軽量・高速モバイルデータベースRealm入門を使って学ぶRealmの勘所2.サンプルからRealmの概要を掴む
サンプルDL (195MB)1. Google検索: realm入門2. 軽量・高速モバイルデータベース Realm入門:書籍案内|技術評論社
3. 本書のサポートページ
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
Realmとは (前書き)• 世界初のモバイルファーストなデータベース• 2016年5月にバージョン1.0がリリース• 最新は2017年3月13日にリリースされたv2.4.4
• 本書は、v2.4.2をサポート Swift 3.0.2
Realmの特徴 (p007)• クラス定義 == モデル定義(テーブル定義)• DBの非同期処理をサポート• 高速 (p009)
• 独自のストレージエンジン(C++)
Realmの特徴 (p007)• マルチプラットフォーム (p010)
• iOS (Swift, Objective-C)• Android (Java, Kotlin)• React Native (JavaScript)• Xamarin (C#)
• データベースファイルは完全なマルチプラットフォームをサポート• iOSで作ったRealmファイルをAndroidで開くことも可能
Realmの特徴 (p007)• 日本語で問い合わせ可能なユーザサポートの窓口 (p011)
• Slack• Realm Japan User Group (Facebook)
• OSS (p012)• realm-cocoa• realm-core
Realmのインストール (p014)• Dynamic Framework• CocoaPods• Carthage
モデル定義 (p027)import RealmSwift
class Person: Object { // RealmSwift.Objectクラスを継承dynamic var name = "" // String型let dogs = List<Dog>() // 1対多の関連
}class Dog: Object { dynamic var name = "" dynamic var age = 0}
モデル定義チートシート (p272)• 非オプショナル型/オプショナル型• 1対1/1対多/逆方向の関連• プライマリキーの指定• インデックスの指定• 保存しないプロパティの指定• 暗黙的に保存しないプロパティ
モデルオブジェクトの生成と初期化 3種類 (p035)1.プロパティ値let dog = Dog() dog.name = "Momo"dog.age = 9
モデルオブジェクトの生成と初期化 3種類 (p035)2. KVCに準拠しているオブジェクトで初期化let dog = Dog(value: ["name": "Momo",
"age": 9])
モデルオブジェクトの生成と初期化 3種類 (p035)3.各プロパティの値の配列で初期化let dog = Dog(value: ["Momo", 9])
モデルオブジェクトの追加 (p039)let realm = try! Realm()// このrealmインスタンスを使いデータベースの操作を行う
// 書き込みトランザクションrealm.beginWrite()realm.add(mydog) // モデルオブジェクトの追加try! realm.commitWrite()
モデルオブジェクトの取得 (p055)let results = realm.objects(Dog.self) // すべてのDogオブジェクト .filter("name CONTAINS 'x'") // nameにxを含む
自動更新 (p069)let realm = try! Realm() // デフォルトRealmを取得// resutlsを生成let results = realm.objects(Cat.self) // Catモデルオブジェクト .filter("age >= 5") // 5歳以上
.sorted(byKeyPath: "age", ascending: true) // ageで昇順ソート
// データベースにCatがないので、resultsは0件です。print("results.count: \(results.count)") // 0
自動更新 (p069)// cat1を加えます。ageは1です。let cat1 = Cat(value: ["name": "Toto",
"age": 1])try! realm.write { realm.add(cat1)}// データベースにCatは1件あるのですが、// cat1.ageが5未満なのでresultsは変わらず0件です。print("results.count: \(results.count)") // 0
自動更新 (p069)// cat1.ageを10に変更します。try! realm.write { cat1.age = 10}// cat1が5歳以上の条件にマッチしたので、// resultsにcat1が自動で追加されます。print("results: \(results)") // [cat1]
自動更新 (p069)// cat2を追加します。ageは5です。let cat2 = Cat(value: ["name": "Rao",
"age": 5])try! realm.write { realm.add(cat2)}// cat2は5歳以上の条件にマッチしているので、// resultsにcat2が自動で追加されます。// ageで昇順ソートもされています。print("results: \(results)") // [cat2, cat1]
自動更新 (p069)// cat2を削除します。try! realm.write { realm.delete(cat2)}// cat2がデータベースから削除されたので、// resultsからcat2が自動で取り除かれます。print("results: \(results)") // [cat1]
マルチスレッド (p074)// マルチスレッドでデータベースにアクセスDispatchQueue.global().async {
// デフォルトRealmを取得 let realm = try! Realm()
// モデルオブジェクトの生成 let otherdog = Dog() otherdog.name = "Hachi" otherdog.age = 5
realm.beginWrite()realm.add(otherdog) // モデルオブジェクトの追加
try! realm.commitWrite()}
通知 (p080)class TableViewController: UITableViewController {
// 通知を有効にしたい期間中は、// NotificationTokenを強参照で保持する必要があります。
var token: NotificationToken?
override func viewDidLoad() {super.viewDidLoad()let realm = try! Realm()// Realmクラスの通知ハンドラを追加する。token = realm.addNotificationBlock
{ (notification, realm) in // 通知ハンドラ
} }}
通知をサポートしているクラス• Realmクラス: いずれかのオブジェクトの変更• Objectクラス: オブジェクト自身の変更• コレクションクラス: コレクションクラスが持つオブジェクトの変更(Results、List、LinkingObjects)
サンプルからRealmの概要を掴む
サンプル 7選1.基本サンプル/11-01_通知/RealmNotification.xcodeproj
2.応用サンプル/11-05_通知のスキップ/RealmWithoutNotifying.xcodeproj
サンプル 7選3.通知の細かい挙動サンプル/11-03通知ハンドラRealmCollectionChange-updateの挙動確認/RealmCollectionChange.xcodeproj
4.検索サンプル/19-08_タイムラインをフィルタリングする/TwitterFilter.xcodeproj
サンプル 7選5.マイグレーションサンプル/20-02_仕様変更のマイグレーションに対応する/TwitterMigration.xcodeproj
6. Realmファイルの動的な切り替えサンプル/20-03_複数ユーザのログインに対応する/TwitterMultiple.xcodeproj
サンプル 7選7.実践的な開発サンプル/20-04_その後の開発/TwitterApp.xcodeproj
よくある質問Q.どういう場合にRealmを選択すればいいの?A. UserDefaults以上に複雑なことをしたい
よくある質問Q. Core Dataよりいいの?A.-学習コスト低- APIがシンプル- 処理が高速
書籍プレゼント3冊優先-勉強会に初めて来た方- Realmを使ったことない方
ご静聴ありがとうございました