狠狠撸

狠狠撸Share a Scribd company logo
軽量?高速モバイルデータベース
Realm入門を使って学ぶRealmの勘所
DevSap勉強会 17/03/26
菅原 祐
@yusuga_
Aplos for Twitter
搁别补濒尘の本を书きました!
軽量?高速モバイルデー
タベ ー ス
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オブジェクト
.?lter("name CONTAINS 'x'") // nameにxを含む
自動更新 (p069)
let realm = try! Realm() // デフォルトRealmを取得
// resutlsを生成
let results = realm.objects(Cat.self) // Catモデルオブジェクト
.?lter("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 {
// 通知を有効にしたい期間中は、
// Noti?cationTokenを強参照で保持する必要があります。
var token: Noti?cationToken?
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
// Realmクラスの通知ハンドラを追加する。
token = realm.addNoti?cationBlock
{ (noti?cation, 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を使ったことない方
ご静聴ありがとうございました

More Related Content

書籍「軽量?高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所