Realmの基本的な操作

## なぜこの記事を書いたか
つい最近まで仕事でiOSアプリを開発していたんですけど、ニートになったんで暇だから以前触っていたRealmについて忘れないように
備忘録というか、運動後のストレッチ的な感覚で適当につらつら書いていきます。
ニートは好きなこと何でも出来ていいですね。

## Tableの作成
RealmではTableって言わないでModelって言うんだっけか・・・？
基本的には[Realm](https://realm.io/docs/swift/latest/)←ここに書いてあることですが、


    import RealmSwift

    class HogeEntity: Object {
    
        @objc dynamic var not_optional_bool = false // 非OptionalなBool
        let optional_bool = RealmOptional<Bool>() // OptionalなBool
    
        @objc dynamic var not_optional_int = 1 // 非OptionalなInt
        let optional_int = RealmOptional<Int>() // OptionalなInt
    
        @objc dynamic var not_optional_float: Float = 0.0 // 非Optionalなfloat
        let optional_float = RealmOptional<Float>() // Optionalなfloat
    
        @objc dynamic var not_optional_double: Double = 0.0 // 非Optionalなdouble
        let optional_double = RealmOptional<Double>() // Optionalなdouble
    
        @objc dynamic var not_optional_string = "" // 非OptionalなString
        @objc dynamic var optional_string: String? = nil // OptionalなString
    
        @objc dynamic var not_optional_data = Data() // 非OptionalなData
        @objc dynamic var optional_data: Data? = nil // OptionalなData
    
        @objc dynamic var not_optional_date = Date() // 非OptionalなDate
        @objc dynamic var optional_date: Date? = nil // OptionalなDate
    
        @objc dynamic var optional_object: TestObject? // OptionalなObject, (※)ObjectはOptionalのみ
    
        let non_optional_list = List<Int>() // 非OptionalなList
    
        // Primary Keyに指定する値は変数名をそのまま記述してあげる。
        override static func primaryKey() -> String? {
        
            return "not_optional_int" 
        }
    }

    // 例えば緯度経度を一纏めにして保存したいよ！って場合はObject型にして保存してあげたりとか。
    class TestObject: Object {
    
        var longitude: Float?
        var latitude: Float?
    }



## Add
値を新しく追加したい場合

    func addDayo() {
        
        let entity = HogeEntity()
        
        entity.not_optional_string = "新しく追加したよ"
        
        do {
            let realm = try Realm()
            try realm.write {
                
                realm.add(entity)
            }
        }
        catch {
            
            print(error.localizedDescription)
        }
    }

## Delete
値を削除したい場合

    func delete(entity: HogeEntity) {
        
        do {
            let realm = try Realm()
            try realm.write {
                
                realm.delete(entity)
            }
        }
        catch {
            
            print(error.localizedDescription)
        }
    }

## Fetch (単体)
PrimaryKey指定で値を取得したい場合

    func fetch(primaryKey: Int) -> HogeEntity? {
        
        do {
            
            let realm = try Realm()
            return realm.object(ofType: HogeEntity.self, forPrimaryKey: primaryKey)
        }
        catch {
            
            print(error.localizedDescription)
            return nil
        }
    }

## Fetch (複数)
例えば
HogeEntity#not_optional_stringに**FUGA**が含まれるものだけ取得したい場合

    func fetch() -> [HogeEntity]? {
        
        let predicate = NSPredicate(format: "not_optional_string contains 'FUGA'")
        
        do {
            
            let realm = try Realm()
            return Array(realm.objects(HogeEntity.self).filter(predicate))
        }
        catch {
            
            print(error.localizedDescription)
            return nil
        }
    }

## Update
値の更新を行いたい場合

    func update() {

        do {
            let realm = try Realm()
            
            guard let updateTarget = realm.object(ofType: HogeEntity.self, forPrimaryKey: 1) else {
                
                return
            }
            try realm.write {

                updateTarget.not_optional_bool = true
            }
        }
        catch {
            
            print(error.localizedDescription)
        }
    }


## とりあえず
基本的に使用するのはこの程度かな？と思いますので現状ここまでにしておきます。
気が向いたら+@で追記していきます。