如何在Realm中设置自动增量键?

dri*_*ing 34 realm ios

我为每个ChatData对象都有一个唯一的msgid.

@interface ChatData : RLMObject
@property NSInteger msgid;
....
@end
Run Code Online (Sandbox Code Playgroud)

但每次我创建一个新对象时,我必须查询所有对象并获取最后一个msgid.

RLMArray *all = [[ChatData allObjects] arraySortedByProperty:@"msgid" ascending:YES];
ChatData *last = [all lastObject];
ChatData *newData = [[ChataData alloc]init];
newData.msgid = last.msgid+1;
Run Code Online (Sandbox Code Playgroud)

有没有一种有效的方法来替换这种实现?

jps*_*sim 51

Realm没有自动增量行为,因此您需要自己管理.我鼓励您问自己有关数据的问题:

是否需要连续的,连续的整数ID?

如果没有,那么唯一的字符串主键可能就足够了.然后你可以使用类似的东西[[NSUUID UUID] UUIDString]来生成唯一的字符串ID.关于这一点的好处是,即使在多线程场景中,这些UUID也或多或少地保证是唯一的.

如果是这样,始终将最后一个数字保留在内存中可能更有效,因此每次生成新ID时都不需要查询.如果可能在多个线程中创建对象,请确保使您的nextPrimaryKey()函数是线程安全的,否则它可能会生成相同的数字两次(或更多!).

  • 对于*Swift*使用此`NSUUID().UUIDString` (4认同)
  • 有没有计划向Realm添加自动增量行为? (3认同)
  • 可以把它放在`+ defaultPropertyValues`字典中不是吗?我指的是`[[[NSUUID UUID] UUIDString]`. (2认同)

Kir*_*odi 12

您在Swift中将此代码用于自动增量主键:

var myvalue = realm.objects(ChatData).map{$0.id}.maxElement() ?? 0
myvalue = myvalue + 1
Run Code Online (Sandbox Code Playgroud)


Pab*_*uan 11

Swift 2.0中的Autoincrement id Realm:在类领域和对象写入中插入代码

import Foundation
import RealmSwift

class Roteiro: Object {

dynamic var id = 0
dynamic var Titulo = ""
dynamic var Observacao = ""
dynamic var status = false
dynamic var cadastrado_dt = NSDate()

override static func primaryKey() -> String? {
    return "id"
}

//Incrementa ID
func IncrementaID() -> Int{
    let realm = try! Realm()
    if let retNext = realm.objects(Roteiro.self).sorted(byKeyPath: "id").first?.id {
        return retNext + 1
    }else{
        return 1
    }
}
Run Code Online (Sandbox Code Playgroud)

在文件写入使用:

let Roteiro_Add = Roteiro()
    //increment auto id
    Roteiro_Add.id = Roteiro_Add.IncrementaID()

    Roteiro_Add.Titulo = TituloDest
    Roteiro_Add.Observacao = Observacao
    Roteiro_Add.status = false


    let realm = try! Realm()
    try! realm.write({ () -> Void in
        realm.add([Roteiro_Add])
    })
Run Code Online (Sandbox Code Playgroud)

  • 这既昂贵又不是线程安全的. (5认同)
  • 谢谢兄弟 :) 又好又快! (2认同)
  • if let retNext = realm.objects(Roteiro.self).sorted(byKeyPath: "id").first?.id { 这应该是最后一项,就像 if let retNext = realm.objects(Ordernew.self).sorted(byKeyPath: "id").last?.id { (2认同)

Gov*_*iyo 5

在 Realm 中,您需要自行管理 auto-inc ID,因此有很多方法可以管理它。下面是其中一些。

 func incrementID() -> Int {
        let realm = try! Realm()
        return (realm.objects(Person.self).max(ofProperty: "id") as Int? ?? 0) + 1
    }
Run Code Online (Sandbox Code Playgroud)

每次添加记录时都调用此方法。