渋谷で引きこもってる社長です

株式会社Chotchy代表取締役 / エンジニア

Swift + RealmでAuto Increment付きのデータベースを作る

どうも。

最近、モバイルのエンジニアをかなり募集しているのでたまにはテックブログでも書くかなと。

 

じつは、6月末くらいからSwiftを初めてだいたい2ヶ月なのですが、だいぶ慣れてきました。そもそも、日本語のリファレンスやブログが少ないので英語が読めない保守的な人間が多い日本ではまだまだSwiftは普及しなさそうですが、わりとobject-cよりもすっきりしている印象を受けます。

 

さらに、モバイルのデータベースを使うなら圧倒的にRealmをお勧めします。SQLが慣れているからとかいう理由でSQLiteを使うと思うのですが、断然Realmの方がすっきりしております。

日本語のリファレンスもあります。

ダウンロード等はこちらから。

Realm is a mobile database: a replacement for SQLite & Core Data

 

ただ、一つRealmにはAutoIncrementの機能が付いてません。そこがちょっとめんどい。

なので僕は普通にsort()で逆順にして最大id + 1とすることでAutoIncrementを実現してます。

            let realm = Realm()
            var max = realm.objects(Message).sorted("id",ascending:false)
            //保存する
            let m = Message()
            m.id = max[0].id + 1
            ...........
            realm.write {
                      realm.add(m, update: true)
            }

idはprimary keyに設定しておきます。

import RealmSwift

class Message: Object {
    dynamic var id = 0
    dynamic var user_id = 0
    dynamic var content = ""
    dynamic var isread = 0
    dynamic var created: NSDate!
    
    //primary keyに設定します
    override static func primaryKey() -> String? {
        return "id"
    }
}

ちなみに、SwiftMysqlのtimestampからNSDateに変換するには、

    
                        //APIから受け取ったdataをSwiftyJSONで変換
                        let json = JSON(data)
                  var dateAsString: String = json["post"][i]["created"].stringValue
                        var formatter: NSDateFormatter = NSDateFormatter()
                        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
                        var date: NSDate = formatter.dateFromString(dateAsString)!

とできます!

 

ぜひ、一緒にモバイルで新しいアプリやサービスを作ってみたい人、Swift + Realmに挑戦したい人は、info[ @ ]chotchy.comまで!待ってます!