본문 바로가기
iOS/Swift

Swift Realm (1)

by DnaJ 2018. 12. 6.
반응형

Swift Realm (1)


App을 만들때 대부분 DB가 필요하다.

이전에는 CoreData와 SQLite를 썼지만 이제는 Realm을 쓰려고 한다.


Realm을 사용하는 이유는 몇가지가 있지만 가장 큰 것은 성능이다!!!!!

Realm과  SQLite의 벤치마크 결과는 Realm Blog에서 볼수 있다. 또한, 구글 검색으로 여러 결과들을 볼 수있다.

출처 Realm Blog : https://realm.io/kr/blog/introducing-realm-react-native/


Realm은 홈페이지에 한글로 번역이 잘되어 있다. 하지만 최신버전은 번역이 되어있지 않으니 영문으로 봐야 한다.


Cocoapods으로 설치하기

Podfile에 하기와 같이 넣어준다. 그리고 pod install or pod update실행 (음.... Cocoapods은 나중에 작성해야겠다....또륵.... )

잘되나 빌드를 해보자!!

설치가 안된다면 Cocoapods을 업데이트 진행 후 다시 해보자!


target 'projectName' do

    #Realm

    pod 'RealmSwift'

end


Realm 관리 객체를 만들기

1. RealmSwift를 inport를 해야한다.

- RealmSwift안에 UIKit등 기타 필요한 요소들이 import되어있다.

 

2. 속성표를 보고 객체를 정의한다. (홈페이지에서 복사해 왔음...)


3. 비관리 객체가 필요하면 copy함수를 작성한다.

- copy를 하게되면 비관리 객체로 복사가 된다.



관리객체 : 트랜젝션 안에서만 Write를 할 수있고, Write를 할 경우에 Realm에 반영이 된다.

비관리객체 : 일반객체와 동일하다.


@objcMeembers 

Objective-c 유형 기능을 사용하기 위해서 붙인다고 한다.

변수 앞에 @objc 이렇게 붙여도 되긴 하지만 개인적으로 모든 변수에 붙이려니 힘들어서.........



dynamic

블로그와 Developer page에 설명이 잘나와있다. 

apple developer : https://developer.apple.com/swift/blog/?id=27

tstory : https://zeddios.tistory.com/296




import RealmSwift


@objcMembers class CompanyInfo: Object, NSCopying {

    dynamic var id: Int = 0

    dynamic var name: String? = nil

    dynamic var address: String? = nil

    dynamic var tel: String? = nil

    dynamic var fax: String? = nil

    

    

    func copy(with zone: NSZone? = nil) -> Any {

        let copy = CompanyInfo()

        copy.name = self.name;

        copy.address = self.address;

        copy.tel = self.tel;

        copy.fax = self.fax;

        

        return copy

    }


    override static func primaryKey() -> String? {

        return "id"

    }

}


primaryKey를 등록하기 위해서 위와같이 함수를 override해서 지정해 준다.


속성표

TypeNon-optionalOptional
Booldynamic var value = falselet value = RealmOptional<Bool>()
Intdynamic var value = 0let value = RealmOptional<Int>()
Floatdynamic var value: Float = 0.0let value = RealmOptional<Float>()
Doubledynamic var value: Double = 0.0let value = RealmOptional<Double>()
Stringdynamic var value = ""dynamic var value: String? = nil
Datadynamic var value = Data()dynamic var value: Data? = nil
Datedynamic var value = Date()dynamic var value: Date? = nil
Objectn/a: must be optionaldynamic var value: Class?
Listlet value = List<Class>()n/a: must be non-optional
LinkingObjectslet value = LinkingObjects(fromType: Class.self, property: "property")n/a: must be non-optional

출처 : https://realm.io/kr/docs/swift/latest/



쓰기

일단 Realm에 데이터를 넣어봐야 읽을수 있으니 먼저 쓰기부터!!



func saveCompanyInfo() {

        let companyInfo: CompanyInfo = CompanyInfo()

        companyInfo.name = "회사"

        

        //realm 기본 객체 얻어오기

        let realm = try! Realm()

        

        //write 트랜젝션

        try! realm.write {

            //객체 복사 및 업데이트

            //해당 객체가 있으면 업데이트를 하고 아니면 새로 생성한다.

            //companyInfo의 값이 복사되어 새로운 객체가 생성된다.

            //새로 생성된 객체는 관리객체, 원본은 비관리객체로 남게된다.

            let newCompanyInfo = realm.create(CompanyInfo.self, value: companyInfo, update: true)

            

            //object add and update

            //객체 add 및 업데이트

            //companyInfo가 관리객체로 변경이 된다.

            //add함수 이후 companyInfo를 수정하면 realm에도 반영이 된다.

            realm.add(companyInfo, update: true)

        }

        

        // Realm파일이 생성되는 위치 출력

        print(Realm.Configuration.defaultConfiguration.fileURL!)

    }



정상적으로 객체가 삽입이 되었는지 확인하기 위해서 여러가지 방법이 있지만

AppStore에서 realm browser를 받아서 실행 시켜보면 어떻게 들어가있는지 확인 할수 있다.




읽기

단순하게 전체 데이터를 읽어보겠다. 쿼리는 다음블로그에서....


 let realm = try! Realm()

 print(realm.objects(CompanyInfo.self))


끝!!! 정상적으로 입력이 되었다면 잘 출력될것이다.


오늘은 여기까지........




반응형

'iOS > Swift' 카테고리의 다른 글

RxSwift (ReactiveX)  (0) 2019.04.26
Swift Contacts read and write (주소록 읽기, 쓰기)  (0) 2019.01.13
Swift Realm (2) - 조회하기  (0) 2019.01.06
Swift Xib localization  (0) 2018.11.18
swift Xib에 CustomView넣기  (0) 2018.11.17

댓글