我有一个基于窗口的应用程序,其中集成了标签栏和导航栏.在导航栏上有一个自定义按钮,用于打开表格视图.
在单击表格的单元格时,我想打开一个新的表格视图控制器.但是一旦我点击第一个表格的单元格,我就会得到一个例外
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'AddForm''
Run Code Online (Sandbox Code Playgroud)
我检查过那AddForm是对的地方.
我已经尝试了上面给出的所有解决方案和其他线程,但仍然卡住了.我希望有一个人可以帮助我.
流程是这样的
ListButton(单击打开列表视图) - >打开表视图 - >(单击一个单元格应该打开一个新的表视图控制器并从核心数据中获取数据)
我的根视图控制器代码在第二个表视图控制器文件中...是我做错了什么?我这样做是因为我之前不需要核心数据....
请帮忙
提前致谢
core-data tabbar viewcontroller navigationcontroller nsmanagedobjectcontext
我的应用程序在iPhone设备上运行,也在模拟器中运行.Everythings似乎很好,但我在构建期间看到编译器警告.我讨厌提供不完全正确的代码,所以我需要摆脱这个警告.编译器警告是:
newsReaderController.m:24:警告:在协议中找不到'-managedObjectContext'
守则是:
- (void)viewDidLoad {
[super viewDidLoad];
//CORE DATA
if (managedObjectContext == nil) {
managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
}
}
Run Code Online (Sandbox Code Playgroud)
CoreData操作的managedObjectContext在App Delegate中设置.核心数据框架是重要的,应用程序就像一个魅力.
有什么暗示吗?我现在正在使用Objective-C几周,但似乎每天都有新的东西要学习:)
我正在尝试了解 iOS Core 数据瞬态属性,但在理解某些行为时遇到了麻烦。
设置
我有两个上下文,一个主上下文和一个私有上下文。我称它们为 mainContext 和 threadedContext 。
线程上下文是父上下文,主上下文是子上下文。(我这样做是因为我的线程上下文比我的主线程和 UI 更频繁地更改模型。
我有需要通过上下文传递的值的瞬态属性。
我发现有时我失去了价值,有时我不依赖于我如何运行。
样本
此代码已被简化以显示问题。我有一个 Person 对象。Person 对象有一个名为“other”的瞬态实体,您将看到我为其分配了一个 Other 对象,该对象具有几个简单的属性,仅此而已。
- (void)case1
{
NSManagedObjectContext *mainThreadContext = [AppDelegate appDelegate].mainThreadContext;
NSManagedObjectContext *threadedContext = [AppDelegate appDelegate].threadedContext;
__block NSManagedObjectID *objectID = nil;
[mainThreadContext performBlockAndWait:^{
//create
Person *aPerson = [self createAPersonOnContext:mainThreadContext];
//setup
Other *other = [[Other alloc] init];
aPerson.other = other;
aPerson.other.favoriteColor = @"Blue";
aPerson.other.city = @"Provo";
//save
NSError *error = nil;
[mainThreadContext save:&error];
objectID = aPerson.objectID;
NSLog(@"%@",aPerson);
}];
}
Run Code Online (Sandbox Code Playgroud)
当我像这样检索对象时,仍然设置了 person.other 属性(请注意,我在检索对象后正在保存: …
我找不到任何关于此的澄清,所以它可能是一个错误.
问题是,我有一系列父子管理对象上下文.
当我保存子上下文时,更改会被推送到父级,我可以使用普通的旧NSFetchRequest来获取.
但是,如果我依赖NSFetchedResultsController将这些更改拉到第一个兄弟的上下文中,他们就看不到它们了.
呼叫-(void)performFetch: error;似乎也没有拉动变化.
重新启动应用程序后,所有新数据都可用.
我的假设是NSFetchedResultsController仅从其当前上下文中获取并且不会跟随链到持久性存储.
有人可以请我直接在这里吗?
我是否必须使用通知来监控其他上下文的更改?
最后,这是在doc的某处提到的吗?我找不到它的生命.
cocoa core-data nsfetchedresultscontroller nsmanagedobjectcontext ios
当我在一个子上下文中更改托管对象(之后保存)并在其他子上下文中删除(首先保存)时,我的应用程序崩溃了.
如何重现:1.
使用"空应用程序"模板创建新项目并启用核心数据.
2.将managedObjectContext getter更改为以下(我更改了并发类型)
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
3.请将didfinishLaunching方法替换为以下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
{
//insert
NSManagedObjectContext *insertingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[insertingContext setParentContext:self.managedObjectContext];
[insertingContext performBlockAndWait:^{
Test *test … 我花了几个小时试图解决父子核心数据模型的问题.但是,让我们从头开始.我有主要的上下文和子上下文.parentContext作为主要上下文.
- (NSManagedObjectContext *)mainContext {
if (!_mainContext) {
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}
return _mainContext;
}
- (NSManagedObjectContext *)childContext {
if (!_childContext) {
_childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_childContext setParentContext:self.mainContext];
}
return _childContext;
}
Run Code Online (Sandbox Code Playgroud)
接下来,我在分离的上下文中创建两个对象.
Entity2 *entity2 = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Entity2 class])
inManagedObjectContext:_stack.childContext];
Entity1 *entity1 = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Entity1 class])
inManagedObjectContext:_stack.mainContext];
entity1.arg1 = @"ABC";
entity1.arg2 = @"DEF";
Run Code Online (Sandbox Code Playgroud)
一切都好.
然后我想将一个对象添加到另一个对象的关系中,无论我是否尝试添加entity1,entity2反之亦然.
[entity1 setEntity2:entity2];
Run Code Online (Sandbox Code Playgroud)
在多语境核心数据的文章中| Cocoanetics我读过我应该用保存操作执行块,因为对象不相互了解.所以它看起来像这样:
[_stack.childContext performBlock:^{
NSError *error;
if (![_stack.childContext …Run Code Online (Sandbox Code Playgroud) 我有Core Data的问题,因为我不知道处理问题的最佳方法:
我从服务器加载一个json并在ManagedObjects中解析结果.起初,ManagedObjects应该是临时的.但是用户可以将ManagedObject放到传单中.然后ManagedObject应保存到CoreData.(该对象应该可以脱机访问)当用户稍后从服务器加载相同的对象时,应该获取已保存的ManagedObjects.
所以我不想把用户不需要的CoreData/PersistantStore中的每个对象都放在一起.
首先我要做的是创建一个背景上下文:
__block NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = context;
Run Code Online (Sandbox Code Playgroud)
使用fetch,我检查persistantstore中是否已存在ManagedObject.如果有的话,我会接受这个.否则在nil上下文中创建一个新的ManagedObject.
NSArray *results = [backgroundContext executeFetchRequest:fetch error:&error];
if (!error && results.count == 1) {
myModel = [results objectAtIndex:0];
}
else {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" inManagedObjectContext:backgroundContext];
myModel = (MyModel *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
}
Run Code Online (Sandbox Code Playgroud)
我对每一段关系都这样做:
if (! myModel.relation) {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Relation" inManagedObjectContext:backgroundContext];
myModel.relation = (Relation *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:myModel.managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)
通过创建模型到目前为止工作正常.但如何保存一个模型?
managedObjectContext为nil.如果我在managedObjectContext上调用save:它会保存所有内容.
在我的AppDelegate中,我写了一个函数来在主ManagedObjectContext中插入一个ManagedObject:
- …Run Code Online (Sandbox Code Playgroud) core-data temporary nsmanagedobject nsmanagedobjectcontext ios
我已经看过很多教程,他们真的帮助我了解父子管理对象上下文以及与此相关的其他事情.我准备开始在我的应用程序中使用它,但我有一个问题.为什么没有人使用单例来保持主要的托管对象上下文.我想从AppDelegate中提取Core Data相关对象并将其设置为自己的类更好?像raywenderlich.com这个教程中的内容.但是他们仍然实例化CoreDataStack类(没有问题,单例也必须实例化)并且当需要时他们在prepareForSegue中设置managedObjectContext(并将其设置为来自AppDelegate的第一个视图控制器).为什么不删除这个需求,只使用单例CoreDataStack,并且如果需要可以在每个控制器中使用managedObjectContext?
第二个和奖金问题:我认为最好在控制器中使用更少的代码,在其他类中使用更多的代码.我认为这有助于提高可读性.那么如果我从控制器移动此代码并将其设置为CoreDataStack类或其他一些有助于核心数据请求和响应的类,该怎么办?
func surfJournalFetchRequest() -> NSFetchRequest {
let fetchRequest =
NSFetchRequest(entityName: "JournalEntry")
fetchRequest.fetchBatchSize = 20
let sortDescriptor =
NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
Run Code Online (Sandbox Code Playgroud)
我知道这是可能的,但它更好吗?如果您从我那里获得应用程序代码,那么如果在控制器中它会是一行会更好CoreDataStack.fetchRequest("JournalEntry", sortedKey: "date")吗?
如果我接受这个代码并将其插入单例并使用闭包创建函数呢?我会在单例中创建子管理上下文并在那里做必要的操作,在控制器中我只会更改UI:
func exportCSVFile() {
navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem()
let privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = coreDataStack.context.persistentStoreCoordinator
privateContext.performBlock { () -> Void in
var fetchRequestError:NSError? = nil
let results = privateContext.executeFetchRequest(self.surfJournalFetchRequest(), error: &fetchRequestError)
if results == nil {
println("ERROR: \(fetchRequestError)")
}
let exportFilePath = …Run Code Online (Sandbox Code Playgroud) 使用私有上下文触发 CoreData (CRUD) 操作与使用performBlockdispatch_async 后台队列中的主上下文触发此类操作之间有区别吗?
是否只是不应该在后台线程中使用主上下文的情况?
苹果文档的链接在这里。
尝试在我用swift编写的iOS应用程序中删除Core数据的持久存储时,我遇到了崩溃.流程是直截了当的:当我从应用程序注销时,我删除了商店:
destroyPersistentStoreAtURL
我在应用程序中使用本机核心数据实现,并且使用performBlock/performBlockAndWait在托管对象中进行每次访问.此外,这些操作位于NSOperation队列中.流程如下:
有时,我遇到了崩溃,我无法理解为什么.从我看到的,它是与managedObjectsIDs和retain相关的东西.看一看:
destroyPersistentStoreAtURL
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢!