He probado un montón de opciones, pero no puede encontrar la solución para este problema. He creado un Núcleo de archivo de Datos y el nombre de la Cuenta de la entidad, se Creó un atributo de cadena llamado nombre de usuario. Editado luego de la clase de la entidad a NSManagedObject, no estoy seguro si esto es correcto. Ahora, el siguiente código es en mi LoginViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    ITAppDelegate *appDelegate = (ITAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = appDelegate.managedObjectContext;

    Account *newAccount = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context];
    [newAccount setValue:@"Jorge" forKey:@"username"];
    [newAccount setPassword:@"password"];

    NSLog(@"username:%@   password: %@", [newAccount username], [newAccount password]);

}

He seguido Este Tutorial y mis archivos de código parecido a este:

ITAppDelegate.h

#import <UIKit/UIKit.h>

@interface ITAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end

ITAppDelegate.m

#import "ITAppDelegate.h"
#import "LoginViewController.h"

@implementation ITAppDelegate

@synthesize managedObjectContext = _managedObjectContext;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize managedObjectModel = _managedObjectModel;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary    *)launchOptions
{
    //Override point for customization after application launch.
    return YES;
}

#pragma mark - Core Data stack

- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil)
{
    return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext  setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}


- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil)
{
    return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil)
{
    return _persistentStoreCoordinator;
}

    return _persistentStoreCoordinator;
}

@end

AccountBase.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface AccountBase : NSManagedObject

@property (nonatomic, retain) NSString *username;


@end

AccountBase.m

#import "AccountBase.h"

@implementation AccountBase

@dynamic username;

@end

Cuenta.h

#import "AccountBase.h"
#import <CoreData/CoreData.h>

@interface Account : AccountBase

@property (nonatomic, assign) NSString *password;

@end

Cuenta.m

#import "Account.h"
#import "KeychainHelper.h"

@implementation Account

- (NSString*)password
{
    if (self.username)
        return [KeychainHelper getPasswordForKey:self.username];
    return nil;
}

- (void)setPassword:(NSString*)aPassword
{
    if (self.username)
        [KeychainHelper setPassword:aPassword forKey:self.username];
}

- (void)prepareForDeletion
{
    if (self.username)
        [KeychainHelper removePasswordForKey:self.username];
}
@end

KeychainHelper.h

#import <Foundation/Foundation.h>

@interface KeychainHelper : NSObject

+ (NSString*)getPasswordForKey:(NSString*)aKey;
+ (void)setPassword:(NSString*)aPassword forKey:(NSString*)aKey;
+ (void)removePasswordForKey:(NSString*)aKey;

@end

KeychainHelper.m

#import "KeychainHelper.h"
#import <Security/Security.h>
@interface KeychainHelper ()
+ (NSMutableDictionary*)dictionaryForKey:(NSString*)aKey;
@end
@implementation KeychainHelper
static const NSString *ironTrainers = @"com.domain.myapplication";
+ (NSMutableDictionary*)dictionaryForKey:(NSString*)aKey
{
NSData *encodedKey = [aKey dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[searchDictionary setObject:encodedKey forKey:(__bridge id)kSecAttrGeneric];
[searchDictionary setObject:encodedKey forKey:(__bridge id)kSecAttrAccount];
[searchDictionary setObject:ironTrainers forKey:(__bridge id)kSecAttrService];
return searchDictionary;
}  
+ (NSString*)getPasswordForKey:(NSString*)aKey
{
NSString *password = nil;
NSMutableDictionary *searchDictionary = [self dictionaryForKey:aKey];
[searchDictionary setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
[searchDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
CFTypeRef result = NULL;
BOOL statusCode = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, &result);
if (statusCode == errSecSuccess) {
NSData *resultData = CFBridgingRelease(result);
password = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
}
return (__bridge NSString *)(result);
}
+ (void)removePasswordForKey:(NSString*)aKey
{
NSMutableDictionary *keyDictionary = [self dictionaryForKey:aKey];
SecItemDelete((__bridge CFDictionaryRef)keyDictionary);
}
+ (void)setPassword:(NSString*)aPassword forKey:(NSString*)aKey
{
[KeychainHelper removePasswordForKey:aKey];
NSData *encodedPassword = [aPassword dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *keyDictionary = [self dictionaryForKey:aKey];
[keyDictionary setObject:encodedPassword forKey:(__bridge id)kSecValueData];
SecItemAdd((__bridge CFDictionaryRef)keyDictionary, nil);
}
@end

Cualquier ayuda es apreciada. Gracias.

OriginalEl autor ferrojr | 2013-12-09

4 Comentarios

  1. 37
    - (NSManagedObjectContext *)managedObjectContext
    {
    if (managedObjectContext != nil) return managedObjectContext;
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext;
    }
    • No ha proporcionado una carga diferida implementación de persistentStoreCoordinator
    • así coordinator siempre será nil
    • de manera que siempre regresan nil de este método
    • que significa que usted conseguirá siempre el error anterior.

    Para explicar el error:

    +entityForName: nil no es legal NSManagedObjectContext parámetro de búsqueda por nombre de la entidad ‘Cuenta’

    No es inmediatamente evidente a partir de la lectura, pero esto significa que nil no es legal, cosa que pasar para que el objeto administrado contexto. En la primera lectura, parece que estamos haciendo entityForName:nil pero ese no es el caso.

    Para solucionar el problema, usted tendrá que proporcionar una copia del almacén persistente de coordinador. Tengo un pequeño artículo aquí que explica lo poco código que usted necesita para formar el núcleo de una pila de datos, esto puede ayudar a usted.

    Gracias, funcionó para el nombre de usuario. He cambiado aplicación delegado (véase más arriba), pero ahora estoy recibiendo el error: -[NSManagedObject setPassword:]: no reconocidos selector enviado a la instancia
    Bueno, eso es otra cuestión. Que parece que no se ha definido el correcto subclase en su modelo de datos (hay un «Nombre» y «Clase» en la casilla a rellenar)
    Mi modelo de datos tiene un atributo que es el nombre de usuario. Y el nombre de la entidad se Cuenta, la clase que muestra que hay NSManagedObject, que he editado antes, no estoy seguro si eso es correcto, aunque.
    Usted tiene que fijar la clase a la Cuenta y generar la Cuenta.h y Cuenta.m archivos mediante la selección de la entidad y la elección del editor –> crear NSManagedObject subclase..
    Este es mi resultado: nombre de usuario:Jorge contraseña: <70617373 776f7264> supongo que funcionó, ¿verdad?

    OriginalEl autor jrturton

  2. 0

    En mi caso, estoy utilizando múltiples contextos (padre/hijo) con diferentes tipos de concurrencia para mejorar el rendimiento. Tengo tres contextos:

    1. storeContext que es el único contexto cuya persistentStoreCoordinator se había establecido.
    2. viewContext cuyo padre es storeContext
    3. backgroundContext cuyos padres debería haber sido viewContext pero me olvidó poner backgroundContext.parent = viewContext.

    De ahorro de una entidad en la backgroundContext se produce el mismo error…

    +entityForName: nil no es legal NSManagedObjectContext parámetro de búsqueda por nombre de la entidad…

    …porque backgroundContext no era parte de los padres/niño contexto de la cadena.

    Configuración backgroundContext‘s parent a viewContext establecido la cadena de nuevo al almacén persistente de coordinador y resuelto el error.

    OriginalEl autor Clay Ellis

  3. 0

    Me encontré con este entityForName: nil error, pero terminó siendo algo así como un arenque rojo que sólo se manifiesta cuando la ejecución de las pruebas unitarias en mi CI. Durante las pruebas, la aplicación se fue encontrando con algunos extraños roscado condiciones causadas por el NSAttributedString HTML del Importador. Asíncrono de envío en la cola principal para interactuar con los Datos principales de los que estaba sucediendo justo como el NSAttributedString estaba siendo creado a partir de HTML.

    Acaba de publicar mi experiencia aquí en caso de que termina ayudando a alguien más. 🙂

    OriginalEl autor tylermilner

  4. -1

    Podría ocurre debido a la falta de coincidencia de nombre de la entidad y su nombre de la clase. Asegúrese de que la Cuenta de la entidad tiene un adecuado nombre de la clase .archivo xcdatamodeld.

    El mensaje de error indica que el managedObjectContext parámetro es igual a cero, esto no tiene nada que ver con el modelo

    OriginalEl autor Zend

Dejar respuesta

Please enter your comment!
Please enter your name here