広告

【SwiftUI】Realm Databaseの導入とアプリの作成

Swift

当サイトではアフィリエイト広告を利用しています。

広告

はじめに

今回はMac向けのネイティブアプリに、Realmを導入する手順をまとめました。
アプリはSwiftUIを使用して作成します。

今回はMacOSのアプリを作成しますが、iOSの開発の場合でも参考になると思います。

使用するバージョン
  • macOS Monterey (M1)
  • Xcode 13
  • Swift 5
  • SwiftUI
広告

【紹介】個人開発

Mac向けの、定型文の挿入も可能なクリップボード履歴管理アプリです。
Windows版は以前からありましたが、基本的な使い方はMac版も同じですので、もしよかったらダウンロードしてみてください。

  • Xcode
  • Swift
  • SwiftUI
  • Realm Database
  • Appleによる公証済み

Realmとは

Realm Databaseは、データベースを管理するためのシステムです。
もともとモバイル向けでしたが、Macアプリでも使用することができます。

Xcodeには標準でCore Dataというデータベースの管理システムがありますが、Realmはパフォーマンスも良く、個人的にはコーディングがとても楽なので、好んで使用しています。

準備

CocoaPodsを利用してRealmを導入しますので、以下の記事を参考にしてください。

【Mac】CocoaPodsのインストールとアンインストール
MacにCocoaPodsを導入する手順をまとめました。

今回、Mac上で動く簡単なサンプルアプリを作成します。
SwiftUIで実装しますので、以下を参考にプロジェクトを作成してください。

【SwiftUI】Mac向けアプリを作ろう
SwiftUIを使って、Mac向けのネイティブアプリを作成する手順をまとめました。

Realmの導入

CocoaPodsを使用してプロジェクトにRealmを導入します。

ターミナルを開いて、作成したプロジェクトへカレントディレクトリを移動します。
(以下はユーザ直下の例)

% cd ~/SampleApp

プロジェクトディレクトリの直下は以下のようになっていると思います。

% ls
SampleApp		SampleAppTests
SampleApp.xcodeproj	SampleAppUITests

Podsを初期化して、Podfileを作成します。
以下のコマンドを実行します。

% pod init

プロジェクト直下にPodfileが作成されますので、viコマンドか、テキストエディットで開きます。

初期は以下のようになっています。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'SampleApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for SampleApp

  target 'SampleAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'SampleAppUITests' do
    # Pods for testing
  end

end

今回はSwiftに対応したRealmを導入しますので、一行追記し以下のように編集しました。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'SampleApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for SampleApp

  pod 'RealmSwift'

  target 'SampleAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'SampleAppUITests' do
    # Pods for testing
  end

end

Podfileを保存したら、以下のコマンドでプロジェクトにRealmを導入します。

% pod install

以下のように表示され、インストールが完了します。

Analyzing dependencies
Downloading dependencies
Installing Realm (10.28.2)
Installing RealmSwift (10.28.2)
Generating Pods project
Integrating client project

プロジェクトの起動

先ほどのコマンド実行時に、以下のメッセージが表示されました。

[!] Please close any current Xcode sessions and use `SampleApp.xcworkspace` for this project from now on.

通常、Xcodeのプロジェクトを開く際は、「xxx.xcodeproj」ファイルを開きますが、Podsのライブラリを導入した場合は、「xxx.xcworkspace」をダブルクリックで開きます。

Xcodeでプロジェクトを開くことができました。
左ペインのファイル一覧で、「Pods」という項目が表示されます。

今回インストールしたRealmSwiftもインストールされているのが分かります。

広告

簡単な実装

前回作成したアプリを使って、確定ボタンをクリックしたらデータを保存するようにしてみましょう。

SwiftUI向けに簡単な記述もできますが、今回はSwiftで登録処理を実装してみます。

まずはテーブル定義に相当するモデルクラスを作成します。
New Fileを選択します。

macOSのSwift Fileを選択します。

クラス名は任意ですが、今回はPerson.swiftとしました。

作成したファイルを以下のように編集します。
クラス名がテーブル名に、各プロパティがテーブルの項目になります。

import Foundation
import RealmSwift

class Person: Object {

    /// ニックネーム
    @objc dynamic var nickname: String = ""

}

ContentView.swiftを開いて、ボタンのクリックイベントを修正します。
以下のようにクリック押下時に、データを登録するようにしました。

import SwiftUI
import RealmSwift

struct ContentView: View {

    @State var nickName = ""

    /// データを登録
    func add() {

        // インスタンス生成
        let person = Person()

        // 値をセット
        person.nickname = nickName

        // データを登録
        let realm = try! Realm()
        try! realm.write {
            realm.add(person)
        }

    }

    var body: some View {

        VStack {
            Text("Hello, world!")

            // テキスト入力エリア
            TextField("ニックネーム", text: $nickName)
                .frame(width: 90)

            // ボタン
            Button(action: {
                // ボタンイベント
                add()
            }) {
                Text("確定")
            }
        }
        .padding()

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

実行してみましょう。
ニックネームに何か入力し、確定ボタンをクリックします。

完了後の処理を記載しておりませんので何も起こりませんが、別途データが登録されたか確認します。

ちなみに以下のようなエラーがコンソールに表示されますが、一旦無視して大丈夫です。

finished with error [-1003] Error Domain=NSURLErrorDomain Code=-1003 “A server with the specified hostname could not be found.”

詳細については、以下の記事をご覧ください。

【Realm】デバッグ時の分析情報送信をオフ・通信エラーを解決
SwiftでRealmを使用した際に発生するエラーについて、対応策をまとめました。

DBファイルの保存先

Realmデータベースのファイルは以下のフォルダへ保存されます。

/Users/xxx/Library/Containers/com.chigusa-web.SampleApp/Data/Library/Application Support/default.realm

「com.chigusa-web.SampleApp」はBundle Identifierです。

Swfitで以下のコードを実行して、保存先のパスを確認することもできます。

print(Realm.Configuration.defaultConfiguration.fileURL!)

Realm Studioを使ってデータの確認

以下から、Realm Studioをダウンロードしてインストールします。
(Realm Studio-12.0.0.dmg)

https://docs.realm.io/sync/realm-studio

Realmデータベースを簡単に管理するための開発者ツールです。

Realm Studioを起動します。
Open Realm fileをクリックし、先ほどのdefault.realmファイルを開きます。

Xcodeで実行しているMacアプリは終了してください。

データベースの中身が確認できます。
正しくデータが登録されていることが確認できました。

さいごに

今回はMac向けのネイティブアプリに、Realmを導入する手順をまとめました。
簡単にデータの永続化ができますし、コーディングがとても楽です。

是非導入を検討してみましょう。

他にも私のブログで、Swiftについて解説している記事がありますのでご覧ください。

MacOSSwiftプログラミング
広告

個人開発

千草 @chigusa

現役のITエンジニア。 気ままにコードを書いたり技術情報を発信しています。 Webアプリ/Windows・Macアプリ/モバイルアプリなど。 (Java, PHP, Javascript, Swift, Python, C#, 他) 個人開発:Clibor, Quipha, TXT-Crypter, 符計算特訓, チグサツール Kindle本: Laravel9 実践入門, 他

クリップボード履歴

Clibor

Windows

Cliborはシンプルで高機能なクリップボード履歴ソフトです。
また普段よく使うワードを定型文として登録し、いつでもクリップボードに保存することができます。高度なテキスト整形・FIFOモード・ホットキーに対応。

クリップボード履歴

Windows版Cliborの利便性を、そのままMacでも。
定型文登録、高度なテキスト整形、FIFOモードなど、便利なクリップボード履歴機能を利用できます。macOS最新のTahoeにも対応。

テキスト暗号化

テキストを暗号化してURLで共有・保存できる無料サービスです。
パスフレーズを知る人だけが復号できます。登録不要、データはサーバーに保存されません。
Notionでも利用できます。

学習

Quipha

Web / iOS

自分だけの問題集や問題を作成し、クイズを行い、学習に活用することができるアプリです。
例えば、学校の授業、語学学習、IT資格やその他の資格など多彩な分野での学習を支援します。
いつでも、どこでも、あなたの学習をサポート。

ツール

日常の「ちょっとした効率化」をサポートするWeb便利ツール集。
テキスト・データ処理から最新のAI連携まで、日々のちょっとした手間でググりがちなユーティリティを1つの場所に集約。

麻雀

麻雀の符計算をひたすら特訓しマスターしましょう。
初心者の方はもちろん、もっと速く計算したい方にも役立ちます。
5万対局以上の実践から問題を収録。

コメント

  1. nikaho より:

    実機でアプリを動かしたときのローカルDBの中身を、Realm Studioで確認する方法も知りたいです。

タイトルとURLをコピーしました