๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

[RealmSwift] primaryKey์™€ AutoIncrease

by ํ‹ด๋”” 2022. 10. 2.
728x90
๋ฐ˜์‘ํ˜•

์ถœ์ฒ˜ : Realm ํ™ˆํŽ˜์ด์ง€

PrimaryKey

class Customer: Object {
    
    @objc dynamic var idx = 0
    
}
  • primaryKey๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•ด์คŒ
    override class func primaryKey() -> String? {
        return "idx"
    }
  • primaryKey๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์‰ฝ๊ฒŒ primaryKey ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฆฌํ„ด๊ฐ’์ด String์ด๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ ๋ช…์„ ์ŠคํŠธ๋ง์œผ๋กœ ๋ฆฌํ„ดํ•ด์คŒ

AutoIncrease

  • primaryKey๋กœ ์ง€์ •ํ–ˆ๋‹ค๊ณ  ์ž๋™์œผ๋กœ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๊ณ ์œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์—†์Œ
  • realm์€ ์‚ฌ์šฉ์ž ์ง€์ • ํ•จ์ˆ˜์™€ ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ์Œ

์ฐธ๊ณ  ์‚ฌ์ดํŠธ : https://stackoverflow.com/questions/26252432/how-do-i-set-a-auto-increment-key-in-realm

    func incrementID() -> Int {
        let realm = try! Realm()
        if let next = realm.objects(Customer.self).sorted(byKeyPath: "idx").last?.idx {
            return next + 1
        } else {
            return 1
        }
    }

ํ•œ ์ค„์”ฉ ์‚ดํŽด๋ณด๋ฉด

let realm = try! Realm()
  • realm๊ฐ์ฒด๋ฅผ ์–ป์–ด์˜ด
realm.objects(Customer.self).sorted(byKeyPath: "idx")
  • Customer์€ ํ˜„์žฌ Object๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋กœ์„œ, realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๊ธฐ ์Šค์Šค๋กœ์˜ ํƒ€์ž…์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์™€์„œ idx ์ˆœ์œผ๋กœ ์†ŒํŒ…ํ•ด์คŒ
realm.objects(Customer.self).sorted(byKeyPath: "idx").last?.idx
  • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด์˜ id๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ด
  • ์ถœ์ฒ˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” last๊ฐ€ ์•„๋‹Œ first๋กœ ๋˜์–ด ์žˆ์–ด์„œ last๋กœ ๋ฐ”๊พธ์–ด์ค˜์•ผ ํ•จ. ์ด์œ ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‚˜๋ฉด ์†ŒํŒ…ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ first ๊ฐ’์ธ ์ฒซ๋ฒˆ์งธ ์ €์žฅํ•œ ๊ฐ์ฒด์˜ idx๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๋ถ€ํ„ฐ ์ค‘๋ณต๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•จ -> primaryKey๋กœ ์ง€์ •๋˜์–ด ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—๋Ÿฌ๋ฐœ์ƒ
        } else {
            return 1
        }
  • ๋งŒ์•ฝ ๊ฐ’์ด ์—†๋‹ค๋ฉด 1์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” ์ฒ˜์Œ ์ €์žฅ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๊ธฐ์กด์— ์ €์žฅ๋œ ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฏ€๋กœ else๋ฌธ์„ ํƒ€๊ฒŒ๋จ
let customer = Customer()
customer.idx = customer.incrementID()
  • ์‚ฌ์šฉ์‹œ์—๋Š” realm ๋ชจ๋ธ์— ์ €์žฅํ•  ๋•Œ Customer ๊ฐ์ฒด์˜ idx๊ฐ’์„ ์ง€์ •์‹œ incrementID()๋ฅผ ํ™œ์šฉ

์ฃผ์˜ ์‚ฌํ•ญ

 

        let customer = Customer()
        customer.idx = customer.incrementID()
        customer.name = "์‹ ์ธ์‹"
        
        let customer2 = Customer()
        customer2.idx = customer.incrementID()
        customer2.name = "๋ฌธ์„ธ์€"
        
        let customer3 = Customer()
        customer3.idx = customer.incrementID()
        customer3.name = "์‹ฌ์„ธ์€"
        
        try! realm.write {
            realm.add(customer)
            realm.add(customer2)
            realm.add(customer3)
        }
  • ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ for ๋ฌธ์„ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋’ค realm ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— add ์‹œํ‚ค๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ (๋Ÿฐํƒ€์ž„์‹œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ์ฃผ์˜ํ•ด์•ผํ•จ)
  • incrementID() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋’ค ๊ทธ ์ค‘ ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด์˜ primarykey๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜์–ด ์žˆ์Œ
  • ์ด 2๊ฐœ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๋ฐ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋’ค realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๊ฐ์ฒด์˜ ๊ฐฏ์ˆ˜๋Š” 2๊ฐœ์ž„
  • ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ์—์„œ customer, customer2, customer3์˜ idx๋Š” ๋ชจ๋‘ 3์œผ๋กœ ๊ฐ™๊ณ , primaryKey๋กœ ์ง€์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์•„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ. 

 

>>> ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ ค์š”๐Ÿ™Œ๐Ÿป

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€