プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

SwiftのデータベースRealmでデータを検索する。

この記事は2019年01月14日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. SwiftのデータベースRealmでデータを検索する
    2-1. 検索方法
    2-2. 検索条件
    2-3. 並び替え
  3. おわりに

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応

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対応

たった2日でマスターできるiPhoneアプリ開発集中講座 Xcode 10 Swift 4.2対応

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ