Gostaria de adicionar dados principais a um projeto existente do iPhone, mas ainda recebo muitos erros de compilação:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Eu já adicionei o Core Data Framework ao destino (clique com o botão direito do mouse no meu projeto em "Destinos", "Adicionar" - "Estruturas existentes", "CoreData.framework").
Meu arquivo de cabeçalho:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
o que estou perdendo? Iniciar um novo projeto não é uma opção ...
Muito obrigado!
edit
desculpe, eu tenho essas implementações ... mas parece que a Biblioteca está faltando ... os métodos de implementação estão cheios com erros de compilação como " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", mas também com "Expected ')' before NSManagedObjectContext
" (embora parece que os parênteses estão corretos) ...
#pragma mark -
#pragma mark Core Data stack
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store
coordinator for the application.
*/
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created by merging all of the models found in
application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"Core_Data.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:nil error:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should
not use this function in a shipping application, although it may be useful during
development. If it is not possible to recover from the error, display an alert panel that
instructs the user to quit the application by pressing the Home button.
Typical reasons for an error here include:
* The persistent store is not accessible
* The schema for the persistent store is incompatible with current managed object
model
Check the error message to determine what the actual problem was.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Apenas para expor todas as etapas que você realmente precisa executar para adicionar os Dados Principais a um projeto que não os possuía anteriormente:
Etapa 1: adicionar a estrutura
Clique no destino do seu aplicativo (no painel esquerdo, é o ícone superior com o nome do seu aplicativo), vá para a guia 'Build Fhases' e depois em 'Link Binary With Libraries', clique no pequeno '+' na parte inferior e encontre 'CoreData.framework' e adicione-o ao seu projeto
Em seguida, importe os coredados em todos os objetos necessários (da maneira não-sexy) usando:
Rápido
Objetivo C
ou adicione a importação abaixo das importações comuns no seu arquivo .pch (muito mais sexy) assim:
Etapa 2: adicionar o modelo de dados
Para adicionar o arquivo .xcdatamodel, clique com o botão direito do mouse / clique com a tecla Ctrl pressionada nos arquivos no painel direito (como em uma pasta Recursos para segurança) e selecione Adicionar um novo arquivo, clique na guia Dados principais ao selecionar o tipo de arquivo e clique em ' Data Model ', atribua um nome a ele e clique em Next e Finish e ele será adicionado ao seu projeto. Ao clicar neste objeto Modelo, você verá a interface para adicionar as Entidades ao seu projeto com os relacionamentos que desejar.
Etapa 3: atualizar delegado do aplicativo
Em Swift em AppDelegate.swift
No Objetivo C, adicione esses objetos ao AppDelegate.h
Sintetize os objetos anteriores no AppDelegate.m assim:
Em seguida, adicione esses métodos ao AppDelegate.m (certifique-se de colocar o nome do modelo que você adicionou nos pontos mostrados):
Etapa 4: obter os objetos de dados para os ViewControllers onde você precisa dos dados
Opção 1. Use o ManagedObjectContext do VC App Delegate (preferencial e mais fácil)
Conforme sugerido por @ brass-kazoo - Recupere uma referência ao AppDelegate e seu managedObjectContext via:
Rápido
Objetivo C
no seu ViewController
Opção 2. Crie ManagedObjectContext no seu VC e faça com que ele corresponda ao AppDelegate no AppDelegate (Original)
Mostrando apenas a versão antiga para o Objective C, pois é muito mais fácil usar o método preferido
no ViewController.h
No ViewController.m
No AppDelegate, ou classe em que o ViewController é criado, defina o managedObjectContext para ser o mesmo que o AppDelegate
Se você deseja que o viewcontroller usando o Core Data seja um FetchedResultsController, precisará garantir que esse material esteja no seu ViewController.h
E isso está em ViewController.m
Depois de tudo isso, agora você pode usar esse managedObjectContext para executar todos os fetchRequests habituais necessários para a qualidade do CoreData! Aproveitar
fonte
[[UIApplication sharedApplication] delegate]
e, em seguida, o contexto via[appDelegate managedObjectContext]
Para Swift 3: INCLUI SALVAMENTO E RECUPERAÇÃO DE DADOS
Etapa 1 : adicionar estrutura
Passo 2: adicionar modelo de dados
Arquivo> Novo> Arquivo> Dados Principais> Modelo de Dados
SampleData
o arquivo resultante seriaSampleData.xcdatamocelId
Etapa 3: adicione as funções abaixo ao seu App Delegate e adicione "import CoreData" ao topo
PASSO 4: Adicionando entidade e atributo ao modelo
a) Adicionar entidade
b) Adicionar atributo
PASSO 5: salvando dados
PASSO 5: Recuperando dados
fonte
Tente criar o aplicativo Cocoa com suporte para Core Data e veja AppDelegate. Você verá os métodos principais de implementação da pilha de dados, bem como o arquivo de modelo de objeto gerenciado para definir suas entidades e outras coisas relacionadas aos dados principais.
Você nos mostrou apenas o cabeçalho (ou seja, declaração), mas não a implementação (ou seja, a definição) da pilha de dados principais.
fonte
Se você encontrar esse mesmo problema no xcode 4, como eu fiz. É diferente: tive que selecionar o projeto e, em seguida, expanda "Link Binary With Libraries", que mostra as bibliotecas atuais. A partir daí, clique no sinal de mais (+) para selecionar as bibliotecas adicionais necessárias. Coloquei-o no topo do projeto e tive que movê-lo (arrastar e soltar) para o Frameworks Group , mas foi isso.
fonte
Como Eimantas afirmou que você está perdendo a implementação do Core Stack, como
A solução seria criar um novo projeto de driver de dados principal e copiar / colar a implementação em seu projeto.
fonte
Para o Swift 3:
Arquivo-> novo arquivo-> CoreData-> Modelo para criar um modelo.
Consulte este link para obter mais informações sobre como implementá-lo.
fonte
// no Swift 2.2, você pode fazer o seguinte sem alterar o arquivo AppDelegate.
Arquivo-> novo arquivo-> ios-> classe cacau Touch -> defina sua subclasse como NSObject-> nomeie-o como DataController.swift Dentro do arquivo, inclua ///
importar UIKit importar classe CoreData DataController: NSObject {
}
//////
/////// seed () -> def
// definição fetch ()
fonte
view.h
detail.h
fonte
.h
fonte
fonte
fonte
codificação de amostra view1
visualização de detalhes da amostra
savebutton
fonte