我为每个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()函数是线程安全的,否则它可能会生成相同的数字两次(或更多!).
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)
在 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)
每次添加记录时都调用此方法。
| 归档时间: |
|
| 查看次数: |
28506 次 |
| 最近记录: |