繁体   English   中英

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

[英]Store and fetch NSMutableArray in Core Data

当我的应用程序终止/进入后台时,我想将NSMutableArray保存到Core-Data ,并且当我的应用程序启动/变得活动时,我想加载NSMutableArray

我对Core-Data还没有很好的了解。 这是我第一次使用它。 我看了很多视频,教程,以前的Stackoverflow问题和Apple的文档。 我认为我要尝试做的事属于Apple Core-Data文档中的“非标准持久性属性”一章。

我已经建立了一个名为TableViewList的实体,并给了它一个名为List of可转换类型的属性。

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

AppDelegate.h

#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

AppDelegate.m

#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);
}

结果数组返回一个空数组。 我认为我没有正确保存和获取数组。 在此先感谢您的帮助!

我使用此链接在对象中实现NSCoding

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

  1. applicationDidEnterBackground ,方法的前半部分配置您从未使用过的新托管对象上下文。 由于您从应用程序委托那里获得了不同的托管对象上下文,因此不必在此处创建该对象,因此可以删除创建新上下文的代码。 您可能还想在applicationDidBecomeActive使用应用程序委托的上下文,尽管您所拥有的不一定是错误的。

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

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

  4. 无论您做什么,我都不相信您会得到可变的数组。 保存并获取工作后,您将获得一个不可变的数组作为list属性的值。 因此,如果需要使数组可变,则需要调用mutableCopy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM