LoginSignup
59
58

More than 5 years have passed since last update.

Realm × Swift2 でデータを保存してみる

Last updated at Posted at 2015-11-04

Realm

ここを見ればだいたい何でもわかります → Realm Swift

とりあえずマルチプラットフォームで、データを保存できるライブラリです。

コードについても、詳細は、リンク先を参照してください。詳しい使い方も。やっぱり公式が一番です。
この記事では、簡単なサンプルを。
次の記事ではUIImageのシームレスなの保存についてと、autoIncrementなidでの管理について書きました。(画面下部のリンク参照)

cocoapods

cocoapodsでインストールします。

cocoapodsをインストールしていない場合は、Rubyをインストール&cocoapodsをインストールしてください。

Macでは標準で入っていますので、以下の2コマンドのみでOKです。

gem install cocoapods
pod setup

環境

Mac OSX 10.11.6

プロジェクトの作成

Xocodeからそのままプロジェクト作成する

ターミナルで、プロジェクトのフォルダまで移動後、

pod init

をすると、自動的にPodfileというファイルが作成されます。cocoapodsでは、このファイルに、必要なライブラリの一覧を追加しますので、これを編集します。

vim Podfile

iでinsertモードに移行後、

use_frameworks!
の前の#が外れていることを確認します。(ついていれば外す、これはSwiftで使う場合には外します)

その後、

target 'プロジェクト名' do
    pod 'RealmSwift'
end

上のように、〜〜Testsとついていない、targetとendの間にを入力してEscでコマンドモードに移行、:wqで保存して終了

以上でPodfileの編集は完了になります。

vimの使い方がわからない場合、テキストエディットなどを使っても問題ありません。

pod install

でインストールが完了し、

Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing Realm (0.96.2)
Installing RealmSwift (0.96.2)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use realmSample.xcworkspace for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 2 total
pods installed.

みたいなのが出てきます。(バージョンは異なります)

とりあえず次回からは(プロジェクト名).xcodeprojではなく、(プロジェクト名).xcworkspaceのファイルを開くように指示されるので従う。
(xcodeprojを開くとモジュールを読み込めず、コンパイルが通らなくなる)

これで準備は完了。

開いてみる

Xcodeを一度閉じて、(プロジェクト名).xcworkspaceを開いてみる。
一度Runしてみて、今までどおり問題なく動作することを確かめてください
(Realmを一度コンパイルする目的もある、コンパイルするまではモジュールとして読み込めない)

エラーが出る場合、Max OSXやXcodeが最新版でない可能性が高いです。

とりあえずRealmを使ってみる

Userというクラスを作って、それを保存して読みだす流れを試してみよう。

User.swift
import RealmSwift

class User: Object {
    dynamic var id = 1
    dynamic var name = ""
}

クラスの定義。

以下、このクラスに値をセットして、保存する流れを記述する。

ViewController.swift
import UIKit
import RealmSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let me = User()
        me.name = "はるふ"

        let realm = try! Realm()
        try! realm.write {
            realm.add(me)
        }

        print(realm.objects(User))
    }
}

以上で動く。

realm.objects(User)で読みだして、それを直接printしているので、コンソールを見れば、現在のrealmの様子を確認できる。

Runさせるたびに、1つづつ追加されていくので、10回ぐらいすれば、print時に10個のUserオブジェクトが表示されるはずである(内容は同じ)

コードの説明

class User: Object {

保存可能なクラスは、Object(Realmで定義されたクラス)を継承する必要がある。

また、保存可能なプロパティの型は、

Supported property types

String, NSString
Int
Float
Double
Bool
NSDate
NSData
RealmOptional for optional numeric properties
Object subclasses for to-one relationships
List for to-many relationships

のみである。(Option+クリックで閲覧可能な、Objectクラスのマニュアルに書いてある)

dynamic var hogehoge

Realmで保存する型は、dynamic属性でなければなりません(Realm Swift 0.96.0)

let realm = try! Realm()

swift2からは、エラーを投げる可能性のあるものはtryで囲う必要がある。Realm()の場合、権利問題などで、エラーを投げる可能性がある。
ここでは簡単のため、エラーを無視するコードにしたが、よくはない。下のwrite命令も同様。

try! realm.write {
    realm.add(instance)
}

追加で書き込みを行う。
これは、引数としてクロージャを渡す構文 → Swift のクロージャについてのメモ
トランザクションの開始&終了を自動的に行ってくれます。

realm.objects(T)

クラスTで定義されたデータのみ、すべて取得する。ここから一部抽出したりする。
Tはタイプを指定する。うえでは、Userを指定しているので、Userで定義されたデータをすべて取得している

for user in realm.objects(User) {
}

とすれば一つ一つ読みだすことも可能です。

続き

1つめの記事 → Realm × Swift2 でデータを保存してみる(この記事)
2つめの記事 → Realm × Swift2 でidでデータを管理する
3つめの記事 → Realm × Swift2 でシームレスに画像を保存する

59
58
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
58