在核心数据中存储和获取 NSMutableArray
Store and fetch NSMutableArray in Core Data
我想在我的应用程序 terminates/goes 进入后台时将 NSMutableArray
保存到 Core-Data
并且我想在我的应用程序 [=36] 时加载 NSMutableArray
=]活跃。
我对Core-Data
还不是很了解。这是我第一次使用它。我看过很多视频、教程、以前的 Whosebug 问题和 Apple 的文档。我认为我正在尝试做的事情属于 Apple Core-Data
文档中的非标准持久属性章节。
我已经设置了一个名为 TableViewList 的实体,并为它提供了一个名为 List 的可转换类型的属性。
这是我的 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);
}
结果数组returns一个空数组。我认为我没有正确保存和获取数组。预先感谢您的帮助!
我使用 this link 在我的对象中实现 NSCoding
。
好的,这里有几件事要提一下:
在applicationDidEnterBackground
中,方法的前半部分配置了一个你从未使用过的新的托管对象上下文。因为您随后从应用程序委托中获得了不同的托管对象上下文,所以您没有在此处创建的上下文,因此可以删除创建新上下文的代码。您可能还想在 applicationDidBecomeActive
中使用应用委托的上下文,尽管您所拥有的不一定是错误的。
您永远不会保存更改。您需要在托管对象上下文上调用 save:
以将数据保存到持久存储文件。
为了使用可转换的属性,你保存的数据必须符合NSCoding
(因为Core Data不知道如何转换任意classes,NSCoding
是你告诉它做什么的方式)。 NSArray
确实如此,但数组中的所有内容也符合也很重要。如果您的自定义 class 做到了这一点,那您就可以了。如果没有,您需要修复该问题以保存数组或找到其他方法来保存您的数据。
我不相信你会得到一个 mutable 数组,无论你做什么。一旦您开始保存和获取工作,您将获得一个不可变数组作为 list
属性 的值。因此,如果您需要数组可变,则需要调用 mutableCopy
。
我想在我的应用程序 terminates/goes 进入后台时将 NSMutableArray
保存到 Core-Data
并且我想在我的应用程序 [=36] 时加载 NSMutableArray
=]活跃。
我对Core-Data
还不是很了解。这是我第一次使用它。我看过很多视频、教程、以前的 Whosebug 问题和 Apple 的文档。我认为我正在尝试做的事情属于 Apple Core-Data
文档中的非标准持久属性章节。
我已经设置了一个名为 TableViewList 的实体,并为它提供了一个名为 List 的可转换类型的属性。
这是我的 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);
}
结果数组returns一个空数组。我认为我没有正确保存和获取数组。预先感谢您的帮助!
我使用 this link 在我的对象中实现 NSCoding
。
好的,这里有几件事要提一下:
在
applicationDidEnterBackground
中,方法的前半部分配置了一个你从未使用过的新的托管对象上下文。因为您随后从应用程序委托中获得了不同的托管对象上下文,所以您没有在此处创建的上下文,因此可以删除创建新上下文的代码。您可能还想在applicationDidBecomeActive
中使用应用委托的上下文,尽管您所拥有的不一定是错误的。您永远不会保存更改。您需要在托管对象上下文上调用
save:
以将数据保存到持久存储文件。为了使用可转换的属性,你保存的数据必须符合
NSCoding
(因为Core Data不知道如何转换任意classes,NSCoding
是你告诉它做什么的方式)。NSArray
确实如此,但数组中的所有内容也符合也很重要。如果您的自定义 class 做到了这一点,那您就可以了。如果没有,您需要修复该问题以保存数组或找到其他方法来保存您的数据。我不相信你会得到一个 mutable 数组,无论你做什么。一旦您开始保存和获取工作,您将获得一个不可变数组作为
list
属性 的值。因此,如果您需要数组可变,则需要调用mutableCopy
。