Ios 在核心数据中存储和获取NSMutableArray

Ios 在核心数据中存储和获取NSMutableArray,ios,objective-c,iphone,core-data,nsmutablearray,Ios,Objective C,Iphone,Core Data,Nsmutablearray,当我的应用程序终止/进入后台时,我想将NSMutableArray保存到核心数据中,当我的应用程序启动/激活时,我想加载NSMutableArray 我对核心数据还不是很了解。这是我第一次使用它。我看了很多视频、教程、以前的Stackoverflow问题和苹果的文档。我想我要做的是在苹果的核心数据文档中的非标准持久属性章节中 我已经建立了一个名为TableViewList的实体,并为它提供了一个名为List of type transformable的属性 这是我的AppDelegate.h和.

当我的应用程序终止/进入后台时,我想将
NSMutableArray
保存到
核心数据中,当我的应用程序启动/激活时,我想加载
NSMutableArray

我对
核心数据
还不是很了解。这是我第一次使用它。我看了很多视频、教程、以前的Stackoverflow问题和苹果的文档。我想我要做的是在苹果的
核心数据
文档中的非标准持久属性章节中

我已经建立了一个名为TableViewList的实体,并为它提供了一个名为List of type transformable的属性

这是我的AppDelegate.h和.m代码。所有的建议都很好

AppDelegate.h
#导入
#导入“TableViewController.h”
@接口AppDelegate:UIResponder
@属性(强,非原子)UIWindow*window;
@属性(非原子、保留、只读)NSManagedObjectModel*managedObjectModel;
@属性(非原子、保留、只读)NSManagedObjectContext*managedObjectContext;
@属性(非原子、保留、只读)NSPersistentStoreCoordinator*persistentStoreCoordinator;
-(NSString*)应用程序文档目录;
@结束
AppDelegate.m
#导入
#导入“AppDelegate.h”
#进口
@接口AppDelegate()
@结束
@实现AppDelegate
@综合管理模型;
@综合语境;
@综合协调人;
-(无效)应用程序标识符背景:(UIApplication*)应用程序{
AppDelegate*AppDelegate=[[UIApplication sharedApplication]委托];
NSManagedObjectContext*上下文=[appDelegate managedObjectContext];
NSManagedObject*新联系人;
newContact=[NSEntityDescription insertNewObjectForEntityForName:@“TableViewList”在托管对象上下文:上下文中];
NSData*arrayData=[NSKeyedArchivedDataWithRootObject:ListArray];
[新联系人设置值:arrayData forKey:@“列表”];
n错误*错误=nil;
[上下文保存:&错误];
}
-(无效)应用IDBECOMEACTIVE:(UIApplication*)应用{
NSManagedObjectModel*model=[NSManagedObjectModel合并ModelFromBundles:[NSBundle allBundles]];
NSPersistentStoreCoordinator*coordinator=[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];
NSURL*url=[[[[NSFileManager默认管理器]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject]URLByAppendingPathComponent:@“App1.sqlite”];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType配置:nil URL:URL选项:nil错误:nil];
managedObjectContext=[[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
managedObjectContext.persistentStoreCoordinator=协调员;
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
NSEntityDescription*entity=[NSEntityDescription entityForName:@“TableViewList”在managedObjectContext:self.managedObjectContext中];
[FetchRequestSetEntity:entity];
n错误*错误=nil;
NSArray*结果=[self.managedObjectContext executeFetchRequest:fetchRequest错误:&错误];
如果(错误){
NSLog(@“无法执行提取请求”);
NSLog(@“%@,%@”,错误,错误。本地化描述);
}
其他的
NSLog(@“%@”,结果);
}
结果数组返回一个空数组。我认为我没有正确地保存和获取数组。提前感谢您的帮助


我过去常常在我的对象中实现
NSCoding

好的,这里有几件事要提:

  • ApplicationIdentinterBackground
    中,该方法的前半部分配置了一个您从未使用过的新托管对象上下文。由于您随后从应用程序委托获得不同的托管对象上下文,因此您不需要在此处创建的托管对象上下文,因此可以删除创建新上下文的代码。您可能还希望在
    applicationIDbecomeactive
    中使用应用程序委托的上下文,尽管您所使用的并不一定是错误的

  • 您永远不会保存更改。您需要在托管对象上下文上调用
    save:
    ,将数据保存到持久存储文件中

  • 为了使用可转换属性,您保存的数据必须符合
    NSCoding
    (因为核心数据不知道如何转换任意类,而
    NSCoding
    是您告诉它做什么的方式)
    NSArray
    可以,但数组中的所有内容也必须一致。如果您的自定义类这样做,您就可以了。如果没有,则需要修复该问题以保存阵列或找到其他方法来保存数据

  • 我不相信你会得到一个可变数组回来,无论你做什么。保存和获取工作完成后,将获得一个不可变数组作为
    列表
    属性的值。因此,如果需要数组可变,则需要调用
    mutableCopy


  • 好的,这里有几件事要提:

  • ApplicationIdentinterBackground
    中,该方法的前半部分配置了一个您从未使用过的新托管对象上下文。由于您随后从应用程序委托获得不同的托管对象上下文,因此您不需要在此处创建的托管对象上下文,因此可以删除创建新上下文的代码。您可能还希望在
    applicationIDbecomeactive
    中使用应用程序委托的上下文,尽管您所使用的并不一定是错误的

  • 您永远不会保存更改。您需要在托管对象上下文上调用
    save:
    ,将数据保存到持久存储文件中

  • 为了使用可转换属性,您保存的数据必须符合
    NSCoding
    (因为核心数据不知道如何转换任意类,而
    NSCoding
    是您告诉它做什么的方式)<代码>NSArray#import <UIKit/UIKit.h> #import "TableViewController.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property(nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property(nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property(nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; -(NSString *) applicationDocumentsDirectory; @end
  • #import <CoreData/CoreData.h>
    #import "AppDelegate.h"
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    @synthesize managedObjectModel;
    @synthesize managedObjectContext;
    @synthesize persistentStoreCoordinator;
    - (void)applicationDidEnterBackground:(UIApplication *)application {
    
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        NSManagedObject *newContact;
        newContact = [NSEntityDescription insertNewObjectForEntityForName:@"TableViewList" inManagedObjectContext:context];
        NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:ListArray];        
        [newContact setValue:arrayData forKey:@"list"];
        NSError *error = nil;        
        [context save:&error];
    
    
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
        NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent: @"App1.sqlite"];
        [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];
        managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
        managedObjectContext.persistentStoreCoordinator = coordinator;
    
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"TableViewList" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];
        NSError *error = nil;
        NSArray *result = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    
        if (error) {
            NSLog(@"unable to execute fetch request");
            NSLog(@"%@, %@", error, error.localizedDescription);
        }
        else
            NSLog(@"%@",result);
    }