この記事は2019年01月14日に投稿しました。
目次
詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応
- 作者: 大重美幸
- 出版社/メーカー: ソーテック社
- 発売日: 2018/11/03
- メディア: 単行本
- この商品を含むブログを見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回はPWEditorで使用しているSwiftのデータベースRealmでデータを検索する方法についてです。
2. SwiftのデータベースRealmでデータを検索する
2-1. 検索方法
SwiftのデータベースRealmでデータを検索する方法ですが、Realmクラスのobjectsメソッドを使用します。
書式
public func objects<Element: Object>(_ type: Element.Type) -> Results<Element>
引数
type
モデルクラスの型
戻り値
Results
実装例
// モデルクラス import RealmSwift class PersonalInfo: Object { // ID @objc dynamic var id = 0 // プライマリーキー項目(項目名は任意です) // 名前 @objc dynamic var name = "" // 年齢 @objc dynamic var age = 0 // 住所 @objc dynamic var address = "" // Eメールアドレス @objc dynamic var email = "" /** プライマリキーのプロパティ名を返却します。 - Returns: プライマリキーのプロパティ名 */ override static func primaryKey() -> String? { return "id" } }
// 全件検索 // ※条件を指定する、ソートする方法は後述します。 import RealmSwift let realm: Realm do { realm = try Realm() // 全件検索します。 let results = realm.objects(PersonalInfo.self) // 検索結果の件数を取得します。 let count = results.count if (count == 0) { // 検索データ0件の場合 } else { // 検索データがある場合 // コレクションとしてアクセスする場合 // resultは"PersonalInfo"クラスとしてアクセスできます。 for result in results { print("\(result.name)") } // インデックスを指定してアクセスする場合 // results[i]は"PersonalInfo"クラスとしてアクセスできます。 for i in 0 ..< count { print("\(results[i].age)") } } } catch { // 必要に応じて、エラー処理を行います。 }
2-2. 検索条件
検索条件ですが、Resultsクラスのfilterメソッドの引数で指定します。
filterメソッドの引数として、検索条件をNSPredicateで指定する方法もありますが、今回は文字列で指定する方法のみ紹介します。
実行方法は、objectsメソッドに対してメソッドチェーンで実行します。
また検索結果のResultsクラスに対しても実行できます。
書式
public func filter(_ predicateFormat: String, _ args: Any...) -> Results<Element>
引数
predicateFormat
検索条件文字列
後述の比較演算子、パターン演算子、論理演算子を使用して検索条件文字列とします。
検索条件文字列内の”%@"は、検索パラメータに置き換えられます。
"%@"が複数ある場合、検索パラメータの先頭から順番に置き換えられます。
(検索パラメータは"%@"の数分指定する必要があります)
args
検索パラメータ
無し、または複数指定可能です。
検索条件文字列の"%@"を置き換えます。
戻り値
Results
比較演算子
プロパティと値を比較する条件に使用する演算子です。
データ型がInt, Int8, Int16, Int32, Int64, Float, Double, Dateに使用できます。
データ型がboolの場合、"=="、"!="のみ使用できます。
比較演算子 | 内容 | 書式 |
---|---|---|
== | 等しい | プロパティ名 == 値 |
!= | 等しくない | プロパティ名 != 値 |
< | より小さい | プロパティ名 < 値 |
<= | 以下 | プロパティ名 <= 値 |
> | より大きい | プロパティ名 > 値 |
>= | 以上 | プロパティ名 >= 値 |
BETWEEN | 最小値と最小値の間 | プロパティ名 BETWEEN {最小値,最大値} |
パターン演算子
パターンにマッチする条件に使用する演算子です。
データ型がString、Dateに使用できます。
ただしLIKE演算子はStringのみ使用できます。
パターン演算子 | 内容 | 書式 |
---|---|---|
BEGINSWITH | 先頭が指定した文字列 | プロパティ名 BEGINSWITH 値 |
ENDSWITH | 末尾が指定した文字列 | プロパティ名 ENSWITH 値 |
CONTAINS | 指定した文字列を含む | プロパティ名 CONTAINS 値 |
LIKE | ワイルドカード"?"、"*"を使用した検索 | プロパティ名 LIKE 値 |
論理演算子
論理条件に使用できる演算子です。
論理演算子 | 内容 | 書式 |
---|---|---|
AND | 条件1と条件2に一致 | 条件1 AND 条件2 |
OR | 条件1または条件2に一致 | 条件1 OR 条件2 |
NOT | 条件に一致しない | NOT 条件 |
実装例
import RealmSwift let realm: Realm do { realm = try Realm() // 条件として、nameが"yamada"かつageが"20"より大きいデータを検索します。 let results = realm.objects(PersonalInfo.self).filter("name=yamada AND age > 20") // 検索結果の件数を取得します。 let count = results.count if (count == 0) { // 検索結果が0件の場合 } else { // 検索データがある場合 } } catch { // 必要に応じて、エラー処理を行います。 }
2-3. 並び替え方法
並び替え条件ですが、Resultsクラスのsortedメソッドの引数で並び変えたいプロパティ名を指定します。
複数のプロパティ名を指定することはできません。
並び変える方向(昇順、降順)も指定できます。
実行方法は、objectsメソッドまたはfilterメソッドに対してメソッドチェーンで実行します。
また検索結果のResultsクラスに対しても実行できます。
書式
public func sorted(byKeyPath: String, ascending: BOOL = true) -> Results<Element>
引数
byKeyPath
ソートするプロパティ名
ascending
並び変える方向
trueの場合、昇順
falseの場合、降順
実装例
import RealmSwift let realm: Realm do { realm = try Realm() // 条件として、nameが"yamada"のデータを検索し、ageの降順で並び替えます。 let results = realm.objects(PersonalInfo.self).filter("name=yamada").sorted(byKeyPath: "age", ascending: false) // 検索結果の件数を取得します。 let count = results.count if (count == 0) { // 検索結果が0件の場合 } else { // 検索データがある場合 } } catch { // 必要に応じて、エラー処理を行います。 }
3. おわりに
検索に関する機能はこの他にもいろいろありますが、今回は必要最低限と思われる機能を紹介しました。
他の機能については、またの機会に紹介したいと思います。
public func filter(_ predicateFormat: String, _ args: Any...) -> Results
たった2日でマスターできるiPhoneアプリ開発集中講座 Xcode 10 Swift 4.2対応
- 作者: 藤治仁,小林加奈子,小林由憲
- 出版社/メーカー: ソシム
- 発売日: 2018/10/22
- メディア: 単行本
- この商品を含むブログを見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688