快速从领域中删除对象
Posted
技术标签:
【中文标题】快速从领域中删除对象【英文标题】:Swift Remove Object from Realm 【发布时间】:2017-04-19 15:06:16 【问题描述】:我有从 JSON 响应中保存列表的领域对象。但是现在我需要从 JSON 中删除该对象,如果该对象不在列表中。我该怎么做? 这是我对领域的初始化
func listItems (dic : Array<[String:AnyObject]>) -> Array<Items>
let items : NSMutableArray = NSMutableArray()
let realm = try! Realm()
for itemDic in dic
let item = Items.init(item: itemDic)
try! realm.write
realm.add(item, update: true)
items.addObject(item)
return NSArray(items) as! Array<Items>
【问题讨论】:
顺便说一句,我有 item.id 的主键 您可能需要查看realm link 以了解如何删除... 【参考方案1】:假设您的 Items
对象有一个 id 属性,并且您想删除未包含在新集合中的旧值,或者您可以删除所有内容
let result = realm.objects(Items.self)
realm.delete(result)
然后将所有项目再次添加到领域, 或者您也可以查询未包含在新集合中的每个项目
let items = [Items]() // fill in your items values
// then just grab the ids of the items with
let ids = items.map $0.id
// query all objects where the id in not included
let objectsToDelete = realm.objects(Items.self).filter("NOT id IN %@", ids)
// and then just remove the set with
realm.delete(objectsToDelete)
【讨论】:
根据realm docs,这应该是NOT id IN %@
。
另外,在 realm.write 中执行删除操作。像这样:试试! realm.write realm.delete(objectsToDelete)
不要忘记在写事务块中添加这个删除操作。【参考方案2】:
如果我删除喜欢的最高投票答案,我会收到崩溃错误。
Terminating app due to uncaught exception 'RLMException', reason: 'Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first.'
在写事务中删除:
let items = realm.objects(Items.self)
try! realm!.write
realm!.delete(items)
【讨论】:
【参考方案3】:func realmDeleteAllClassObjects()
do
let realm = try Realm()
let objects = realm.objects(SomeClass.self)
try! realm.write
realm.delete(objects)
catch let error as NSError
// handle error
print("error - \(error.localizedDescription)")
//如果你想删除一个对象
func realmDelete(code: String)
do
let realm = try Realm()
let object = realm.objects(SomeClass.self).filter("code = %@", code).first
try! realm.write
if let obj = object
realm.delete(obj)
catch let error as NSError
// handle error
print("error - \(error.localizedDescription)")
【讨论】:
【参考方案4】:您可以做的是为您插入的对象分配一个主键,当接收到一个新的解析 JSON 时,您在添加之前验证该键是否已经存在。
class Items: Object
dynamic var id = 0
dynamic var name = ""
override class func primaryKey() -> String
return "id"
插入新对象时首先查询 Realm 数据库以验证它是否存在。
let repeatedItem = realm.objects(Items.self).filter("id = 'newId'")
if !repeatedItem
// Insert it
【讨论】:
【参考方案5】:想到的第一个建议是在从 JSON 插入新对象之前删除所有对象。
在https://realm.io/docs/swift/latest/#deleting-objects了解有关删除领域中对象的更多信息
【讨论】:
【参考方案6】:do
let realm = try Realm()
if let obj = realm.objects(Items.self).filter("id = %@", newId).first
//Delete must be perform in a write transaction
try! realm.write
realm.delete(obj)
catch let error
print("error - \(error.localizedDescription)")
【讨论】:
以上是关于快速从领域中删除对象的主要内容,如果未能解决你的问题,请参考以下文章