我正在使用核心数据框架来管理对象.我有一个实体,它有几个十进制类型的属性.其中包括从其他属性数学计算的属性.例:
@interface Marks : NSManagedObject
{
}
@property (nonatomic, retain) NSDecimalNumber * answerGradeA;
@property (nonatomic, retain) NSDecimalNumber * answerGradeB;
@property (nonatomic, retain) NSDecimalNumber * answerGradeC;
@property (nonatomic, retain) NSDecimalNumber * total;
Run Code Online (Sandbox Code Playgroud)
我想要属性total = 3xanswerGradeA + 2xanswerGradeB + 1xanswerGradeC.
如果有可能这样做,那怎么样?
我正在使用核心数据构建应用程序.由appDelegate加载的我的RootViewController主要来自模板.但是我已将实体名称更改为"Clocks"并添加了一堆行.
我的RootViewController提供了一个带有UINavigationController的MVC.当我将数据保存到我的数据库时,UINavigationController类使用[[UIApplication sharedApplication]delegate]来保存数据以访问我的appDelegate,它实际上预先执行了保存操作.编辑数据的方式相同,但不是在我的app委托中调用insert函数,而是调用update函数.
现在,这一切都很好..实际上完全正确.但是......几次打开编辑并保存在视图中我的应用程序崩溃了.它在模拟器和我的iPhone 4上都是这样做的.这是我的意思的一个例子(电影):http://dl.dropbox.com/u/3077127/has_been_invalidated.mov
这是我的RootViewController.m的代码:
#import "RootViewController.h"
#import "RootViewControllerClockCell.h"
#import "RootViewControllerClockCellFooter.h"
#import "configuration.h"
#import "AddClockViewController.h"
#import "clockAppDelegate.h"
#import "AddClockNavigationController.h"
@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
@end
@implementation RootViewController
@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
[self setTitle:NSLocalizedString(@"Alarms", @"AddClockNavigationController")];
// Set up the edit and add buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showAddAlarmView)];
self.navigationItem.rightBarButtonItem = addButton;
[addButton release];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; …Run Code Online (Sandbox Code Playgroud) 我有一个Person属于Department一对多关系的实体.
我希望能够删除Department时,有没有更多的Person与它(或者通过缺失的相连的S Person实体,或更改了Person的department属性).现在,我正在尝试使用以下处理程序NSManagedObjectContextObjectsDidChangeNotification(目前只是尝试查看删除,并正确删除):
- (void)managedObjectDidChange:(NSNotification *)notification {
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
for (NSManagedObject *obj in updatedObjects) {
if ([obj.entity.name isEqualToString:@"Person"]) {
NSLog(@"Person Changed");
NSManagedObject *department = [(Person *)obj department];
NSLog(@"%i", [[department valueForKey:@"person"] count]);
if ([[department] valueForKey:@"person"] count] == 0) {
NSLog(@"Department has no more people associated with it");
// deletion code
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我删除某个人时,与该部门相关联的人数不会改变.我没有对Department实体进行提取.那是我应该做的吗?
cocoa cocoa-touch core-data nsmanagedobject nsmanagedobjectcontext
我在实现核心数据时遇到了这个错误.
我创建了一个实体'FlashCard',其属性为'question'和'answer'.这两个属性都是NSString类型.
在将新对象插入NSManaged Object后,我尝试设置2个属性,如下所示.
NSManagedObject *newCard = [NSEntityDescription insertNewObjectForEntityForName:@"FlashCard" inManagedObjectContext:self.managedObjectContext];
newCard.question = thisQuestion;
newCard.answer = thisAnswer;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译代码时,我遇到错误"请求成员'问题'在某些东西不是结构或联合'.我得到相同的错误newCard.answer行.
任何关于如何解决这个问题的建议非常感谢!
震
这可能是一个非常简单的问题.我在sql lite db中有很多东西.我可以检索那些东西并将其存储到一个阵列就好了.当我使用i迭代遍历该数组时,for (MyCustomMo *mo in myDataArray)我可以使用例如mo.name来访问托管对象属性.
到目前为止一切正常,但......
后来当我从同一个数组中获取一个对象时,[myDataArray objectAtIndex:index]我得到一个MyCustomMo*但是当我尝试访问该对象的属性时,我得到null.我需要以[myDataArray objectAtIndex]某种方式使用不同的方式吗?
我已经从网址下载了信息,我将这个网址作为NSOperation在NSOperationQueue中发送,我想知道,如何删除特定的NSOperation以下载特定网址的数据,现在我这样做:
AppDelegate *appController = (AppDelegate *) [[UIApplication sharedApplication] delegate];
for (NSOperation *op in appController.seriesQueue.operations) {
if ([op isKindOfClass:[MyDowndload class]]) {
MyDownload *urlInDownload = (MyDowndload *)op;
if ([urlInDownload.myNew.urlName isEqualToString:[managedObject valueForKey:@"urlName"]] && [urlInDownload.myNew.language isEqualToString:[managedObject valueForKey:@"language"]]) {
[op cancel];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在tableview中有信息,所以当我为索引路径删除一行时,我输入此检查,并在[op cancel]行中输入,但我可以在控制台日志中看到该线程仍在下载,如何我能停下来删除吗?
我试图在多个表中插入值(准确地说是25),我能够在所有表中插入记录,除了一个,这是因为一个属性,如果我删除该属性,它开始保存数据到表中但是当我添加该属性并尝试设置其值时,它以EXC_BAD_ACCESS终止.
我尝试更改属性的名称,甚至表格,但没有工作.下面是我的代码::
Ashes *ashesObj = (Ashes *)[NSEntityDescription insertNewObjectForEntityForName:@"Ashes" inManagedObjectContext:managedObjectContext];
[ashesObj setAshes_id:@""];
[ashesObj setArrangement_id:@"34"];
[ashesObj setCasket_order_date:@""];
[ashesObj setCasket_model:@""];
[ashesObj setCasket_supplier:@""];
//[ashesObj setAshes_address:@"N/A"]; (This one is causing problem)
[ashesObj setPostal_code:@"N/A"];
[ashesObj setName_client:@""];
[ashesObj setTelephone:@""];
[ashesObj setEmail:@""];
NSError *error;
if (![managedObjectContext save:&error])
{
NSLog(@"Problem saving: %@", [error localizedDescription]);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用几个用于生成NSManagedObject子类的Core Data实体,当我生成这些类时,我选择了"使用原始数据类型的标量属性"选项.正如所料,整数属性被声明为int16_t属性,浮点float属性在生成的接口中被声明为属性:
@interface TeamStats:NSManagedObject
@property (nonatomic) int16_t pointsScored;
@property (nonatomic) float winPercentage;
@end
Run Code Online (Sandbox Code Playgroud)
在为此接口生成的实现中,我看到这些属性声明为@dynamic:
@implementation TeamStats
@dynamic pointsScored;
@dynamic winPercentage;
@end
Run Code Online (Sandbox Code Playgroud)
现在,根据Core Data文档,我应该为这些标量属性编写访问器方法,因为Core Data无法为我生成它们:
您可以将属性声明为标量值,但对于标量值,Core Data无法动态生成访问器方法 - 您必须提供自己的实现(请参阅"托管对象访问器方法"(第44页)).Core Data自动合成原始访问器方法(primitiveLength和setPrimitiveLength :),但您需要声明它们以禁止编译器警告.
这一切都是有道理的,我可以看到很多SO帖子询问如何编写这些访问器方法,并提供了很多好的答案.
我无法弄清楚的是:我编写了这段代码并在我阅读文档中的这个细节之前就开始使用它,所以我从未编写任何访问器方法.我只是在我的类实现中有@dynamic声明.尽管没有编写我应该需要的访问器方法,代码似乎工作得很好.我已经创建了这个NSManagedObject子类的实例.我已经发送了此类的实例setPointsScored:和pointsScored消息,并将生成的实例保存到其持久性存储中.一切似乎都有效.
我在这里错过了什么?是否存在生成的默认实现,尽管Core Data文档说明了什么?是否会出现我当前的代码无法正常工作的情况?在编写更多NSManagedObject子类之前,我很想了解这里发生了什么......
我从Core Data获取实体,但我无法访问对象值来分配变量等.
这是我的代码:
@IBAction func loadItem(sender: UIButton) {
let appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
let context: NSManagedObjectContext = appDel.managedObjectContext
let request = NSFetchRequest(entityName: "Words")
request.returnsObjectsAsFaults = false
do {
let results:NSArray = try context.executeFetchRequest(request)
for res in results{
print(res)
print(res.word)
}
} catch {
print("Unresolved error")
abort()
}
}
Run Code Online (Sandbox Code Playgroud)
print(res)工作正常,并在控制台中给我对象:
<NSManagedObject: 0x7ff0095355f0> (entity: Words; id: 0xd000000000040000 <x-coredata://0E645702-9493-4D1A-8D55-4482B7948054/Words/p1> ; data: {
image = <89504e47 0d0a1a0a 0000000d 49484452 00000a6c 000006ec 08020000 009fcbb9 fc000001 18694343 50494343 2050726f 6669>;
word = test;
}) …Run Code Online (Sandbox Code Playgroud) 我正在写一个通用的方法与给定的从核心数据实体获取数据entityName,predicate和sortDescriptors。我想将结果作为请求实体的数组返回。如果我给Student作为entityName,则需要返回如下所示的学生数组,
do {
if let results = try CoreDataController.sharedInstance.masterManagedObjectContext.fetch(request) as? [Student] {
if results.count > 0 {
return results
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,在使用给定实体名称的通用方法中,如何将结果转换为相应实体类的数组?
我试图从实体名称生成类,
let coreDataClass = NSClassFromString(entityName) as! NSManagedObject.Type
Run Code Online (Sandbox Code Playgroud)
但这不在数组声明中(在以上代码中的Student中)。请帮助我找到正确的方法。
提前致谢!
nsmanagedobject ×10
core-data ×9
ios ×4
objective-c ×4
iphone ×3
cocoa-touch ×2
swift ×2
casting ×1
cocoa ×1
ios4 ×1
nsoperation ×1
xcode ×1