是否可以使 Core Data 属性唯一,即没有两个 MyEntity 对象可以具有相同的 myAttribute?
我知道如何以编程方式执行此操作,但我希望有一种方法可以使用 xcode 中的图形数据模型编辑器来执行此操作。
我正在使用 iPhone 3.1.2 SDK。
每次在对象上创建时,我都会执行一个类方法,该方法仅在另一个实体不存在时创建一个新实体。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | { TZUser *user = nil; NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"TZUser" inManagedObjectContext:context]; request.predicate = [NSPredicate predicateWithFormat:@"objectId = %@", uniqueUserId]; NSError *executeFetchError = nil; user = [[context executeFetchRequest:request error:&executeFetchError] lastObject]; if (executeFetchError) { NSLog(@"[%@, %@] error looking up user with id: %i with error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [uniqueUserId intValue], [executeFetchError localizedDescription]); } else if (!user) { user = [NSEntityDescription insertNewObjectForEntityForName:@"TZUser" inManagedObjectContext:context]; } return user; } |
从 IOS 9 开始,有一种处理唯一约束的新方法。
您在数据模型中定义独特的属性。
您需要设置托管上下文合并策略"合并策略单例对象,该策略定义了在保存操作期间处理冲突的标准方法"NSErrorMergePolicy 是默认设置,如果存在任何合并冲突,此策略会导致保存失败。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
[_managedObjectContext setMergePolicy:NSOverwriteMergePolicy];
return _managedObjectContext;
}
Apple Ducumentation Merge Policy 中讨论了各种选项
这里得到了很好的回答
扎卡里·奥尔的回答
他还创建了一篇博文和示例代码。
示例代码
博文
最具挑战性的部分是让数据模型属性可编辑。秘诀是左键单击,然后右键单击,然后单击符号添加约束。

我决定使用
例如:
2 3 | // Return NO if there is already an object with a myAtribute of value } |
感谢 Martin Cote 的意见。
您可以覆盖
2 3 4 5 6 | { NSArray *objects = [self fetchObjectsWithMyValueEqualTo:value]; if( [objects count] > 0 ) // ... throw some exception [self setValue:value forKey:@"myAttribute"]; } |
如果你想确保每个
我只是看不到核心数据真正提供的任何帮助。约束功能以及被破坏的功能并没有真正发挥作用。当然,在所有现实世界的情况下,您只需要检查一个是否已经存在,如果存在则使用那个(例如,作为另一个项目的关系字段,当然)。我只是看不到任何其他方法。
为了节省任何人的输入...
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | for guy in guys { // guy.id uniquely identifies let g = guy.id let r = NSFetchRequest<NSFetchRequestResult>(entityName:"CD_Guy") r.predicate = NSPredicate(format:"id == %d", g) var found: [CD_Guy] = [] do { let f = try core.container.viewContext.fetch(r) as! [CD_Guy] if f.count > 0 { continue } // that's it. it exists already } catch { print("basic db error. example, you had = instead of == in the pred above") continue } CD_Guy.make(from: guy) // just populate the CD_Guy save here: core.saveContext() } or save here: core.saveContext() |
请注意,在示例中,您可以在每次添加新内容时保存上下文,或者之后一次全部保存。
(我发现表格/集合绘制速度如此之快,与 CD 结合使用,这真的无关紧要。)
(不要忘记 .privateQueueConcurrencyType )
请注意,此示例基本上不会显示您创建实体并在另一个上下文中写入,并且您必须使用
2 3 | pmoc.parent = core.container.viewContext do { try pmoc.save() } catch { fatalError("doh \\(error)")} |
查看 Apple 文档以进行属性间验证。它描述了如何在查询整个数据库的同时验证特定的插入或更新操作。
我真的很喜欢@DoozMen 的方法!!
我认为这是做我需要做的最简单的方法。
这是我将它安装到我的项目中的方式:
以下代码循环绘制一个相当长的tableView,为每个表行保存一个对象到DB,并为每个对象设置各种对象属性,如
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | request.entity = [NSEntityDescription entityForName:@"Obiettivo" inManagedObjectContext:self.managedObjectContext]; request.predicate = [NSPredicate predicateWithFormat:@"obiettivoID = %d", obTag]; NSError *executeFetchError = nil; results = [[self.managedObjectContext executeFetchRequest:request error:&executeFetchError] lastObject]; if (executeFetchError) { NSLog(@"[%@, %@] error looking up for tag: %i with error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), obTag, [executeFetchError localizedDescription]); } else if (!results) { if (obbCD == nil) { NSEntityDescription *ent = [NSEntityDescription entityForName:@"Obiettivo" inManagedObjectContext:self.managedObjectContext]; obbCD = [[Obiettivo alloc] initWithEntity:ent insertIntoManagedObjectContext:self.managedObjectContext]; } //set the property that has to be unique.. obbCD.obiettivoID = [NSNumber numberWithUnsignedInt:obTag]; [self.managedObjectContext insertObject:obbCD]; NSError *saveError = nil; [self.managedObjectContext save:&saveError]; NSLog(@"added with ID: %@", obbCD.obiettivoID); obbCD = nil; } results = nil; |
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)
我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,
我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia