본문 바로가기
Swfit

[Realm] 데이터 저장하는 방법(Create)

by GGShin 2022. 4. 8.

1. String, Int, Float, Double 저장하기 (primaryKey도)

Realm을 사용해서 데이터를 저장할 때는 .write과 .add를 사용하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ViewController: UIViewController {
    
    let realm = try! Realm()
    var tasks : Results<TestRealmData>!
    
    //...
    
    @objc func addContents() {
        
        let task = TestRealmData(title: myTextField.text!)
        try! realm.write {
            realm.add(task)
        }
      
    }
    
    //...
}
cs

먼저 Realm을 사용하기 위해서는 line 3와 같이 Realm()을 선언해주어야 합니다. 

그리고 DB도 선언해 줍니다. 여기서는 tasks라는 명칭으로 선언하였습니다.

 

생략된 코드에 선언한 DB에 데이터를 저장하는 역할을 할 버튼을 만들어 주었는데요,

버튼에 .addTarget으로 함수를 넣어주게 되어 line#8 처럼 @objc 함수를 만들어 주었습니다. 

함수의 내용을 라인별로 살펴보겠습니다. 

Line#10을 보시면 task 를 따로 선언해주었는데요, 어떤 데이터를 넣을 지 설정해 준 것입니다.

앞서 선언한 tasks는 전체 데이터 바구니를 만들어 준 것이라면, task의 경우 tasks라는 바구니에 들어갈 아이템을 어디서 가져올 것인지 (바구니에 들어갈 아이템이 어떤 아이템인지) 설정해 준 것이라고 볼 수 있습니다. 

여기서는 myTextField라는 텍스트 필드에 입력된 텍스트를 저장하고자 하였습니다. 

그런다음 realm.write을 블록을 만들고 그 안에서 .add를 사용하면 원하는 데이터를 Realm에 저장할 수 있습니다.  

 

Line#4에 있는 TestRealmData는 제가 만들어 준 데이터 베이스 형태인데요, 아래 코드에서 보시다시피 title이라는 String type 과 primaryKey만 저장하는 단순한 데이터 베이스입니다. (Line#6, 8 참고) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Foundation
import RealmSwift
 
class TestRealmData: Object {
    
    @Persisted var title: String
    
    @Persisted(primaryKey: truevar _id: ObjectId
    
    convenience init(title: String) {
        self.init()
      
        self.title = title
    }
}
 
cs

Line#10에 나온 convenience init을 해주었기 때문에 위에서 task를 선언할 때 사용할 수 있었습니다. 

만약에 Int, Double,  Float과 같은 타입의 데이터를 저장하고자 한다면, line#6에서 처럼 원하는 형태의 타입의 데이터 변수를 만들어 주면 저장이 가능합니다. (String이라고 되어 있는 부분에 Int 던 Double이던 대체해주면 되겠죠?)

 

2. Date 저장하기

데이터가 저장된 순간의 연도,날짜,시간 정보를 같이 저장하고 싶다면 어떻게 하면 될까요?

상당히 단순합니다. Date을 저장할 때도 1에서와 마찬가지로 Date을 담을 변수를 만들어 주면 됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Foundation
import RealmSwift
 
class TestRealmData: Object {
    
    @Persisted var title: String
    @Persisted var date: Date
    
    @Persisted(primaryKey: truevar _id: ObjectId
    
    convenience init(title: String) {
        self.init()
      
        self.title = title
    }
}
cs

Line#7에 만들어 준 것 처럼 변수를 선언해주면 끝입니다.

보시면 convenience init에 title만 있지 date는 없습니다. 그 말은 .add를 할 때 자동으로 그 순간의 Date 정보가 DB에 들어갈 수 있다는 것입니다. title: myTextField.text! 을 해준 것처럼 값을 저희가 대입해 줄 필요가 없습니다. 

 

3. Image 저장하기

이미지도 Realm에 저장할 수 있습니다. 다만 파일 자체를 넣는 것이 아니라 이미지의 경로를 등록해주고 이미지 파일 자체는 Filemanager의 document directory안에 저장하는 것입니다. 그래서 이미지를 불러올 때마다 경로 따라 들어가 이미지를 찾아 화면에 보여주게 된다고 합니다. 이미지 파일 자체를 realm에 저장하는 것은 데이터가 너무 커지므로 권장하지 않는다고 합니다.

 

이미지를 저장하기 위해서는 document directory에 접근하여야 합니다.  

 

 

 

 

 

 

반응형