Core data 写入核心数据文件
我对xcode是完全陌生的,因此是objective-c。现在正在编写我的第一个应用程序,呜呜!:-)这个应用程序应该是一本字典。我在写入核心数据sqlite数据库中的字段时遇到问题。我的表名为WordDict,字段为;aNum(字符串)、bLetter(字符串)、cCategory(字符串)、dWord(字符串)、eEnglish(字符串)和fFav(布尔) 我能够将数据读入pickerView控件,并在文本视图中显示与pickerView中的行相对应的信息。但是,我希望,一旦一个单词及其含义分别出现在pickerView和textView中,我可以单击一个按钮(Btnadtofav),BOOL YES将更新到pickerView中显示的当前记录的fFav字段 我尝试了一些方法,但不知道如何将fFav当前字段的值从fetchedResultController传递到按钮操作以更新字段 我尝试了几件使程序崩溃的事情,但出现了一些错误:coredataerror(19)主键必须是其他外键所独有的,例如:NSSQLiteErrorDomain=19 我已经不知所措了,并不是说我一开始就有很多事情要做:-)。下面是我的一些代码:Core data 写入核心数据文件,core-data,xcode5,Core Data,Xcode5,我对xcode是完全陌生的,因此是objective-c。现在正在编写我的第一个应用程序,呜呜!:-)这个应用程序应该是一本字典。我在写入核心数据sqlite数据库中的字段时遇到问题。我的表名为WordDict,字段为;aNum(字符串)、bLetter(字符串)、cCategory(字符串)、dWord(字符串)、eEnglish(字符串)和fFav(布尔) 我能够将数据读入pickerView控件,并在文本视图中显示与pickerView中的行相对应的信息。但是,我希望,一旦一个单词及其含义
#import "SMPWPCDetailsVC.h"
@interface SMPWPCDetailsVC ()
{
int count;
}
@end
@implementation SMPWPCDetailsVC
@synthesize fetchedResultsController = _fetchedResultsController;
@synthesize forFavToUpdate = _forFavToUpdate;
@synthesize forFavWord = _forFavWord;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
-(void)letterCheck: (int) numValue{
if ([self.fetchedResultsController fetchedObjects].count <= numValue) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:_lblCategoryText message:@"The letter chosen does not have entries that fit the above category." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}else{
WordDict *slang = [[self.fetchedResultsController fetchedObjects] objectAtIndex:numValue];
_txtMeaning.text = slang.eEnglish;
_forFavWord = slang.dWord;
_forFavToUpdate = slang.fFav;
count = (int) slang.aNum;
}
}
-(void)viewWillAppear:(BOOL)animated{
[self letterCheck:0];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
_lblLetter.text = _lblLetterText;
//Passes the managedObjectContext along from the AppDelegate
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
NSError *error = nil;
if (![[self fetchedResultsController]performFetch:&error]) {
// Handle the error
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error!" message:@"For some reason there was a problem connecting to the database. Please restart the app and try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
#pragma mark -
#pragma mark PickerView Controls section
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return [[self.fetchedResultsController fetchedObjects] count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
// Display the Words we've fetched on the picker
WordDict *slang = [[self.fetchedResultsController fetchedObjects] objectAtIndex:row];
return slang.dWord;
//Another way to do it -- return [[[self.fetchedResultsController fetchedObjects] objectAtIndex:row]valueForKey:@"dWord"];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[self letterCheck:(int)row];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel *tView = (UILabel *)view;
if (!tView){
tView = [[UILabel alloc] init];
// Setup label properties - frame, font, colors etc
tView.font = [UIFont boldSystemFontOfSize:18];
tView.adjustsFontSizeToFitWidth = YES;
tView.textAlignment = NSTextAlignmentCenter;
}
// Fill the label text here
[tView setText:[[[self.fetchedResultsController fetchedObjects] objectAtIndex:row]valueForKey:@"dWord"]];
return tView;
}
#pragma mark -
#pragma mark Fetched Results Controller section
-(NSFetchedResultsController *) fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WordDict"
inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cCategory == %@ AND bLetter == %@",_lblCategoryText,_lblLetterText];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dWord"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:@"bLetter" cacheName:nil];
return _fetchedResultsController;
}
- (IBAction)btnBack:(UIButton *)sender {
}
- (IBAction)btnHome:(UIButton *)sender {
}
-(void) addToFav: (int) favValue{
WordDict * addFav = [[self.fetchedResultsController fetchedObjects] objectAtIndex:favValue];
addFav.fFav = [NSNumber numberWithBool:YES];
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
- (IBAction)btnAddToFavs:(UIButton *)sender {
[self addToFav:count];
}
@end
-(void) addToFav:favCriteria{
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"WordDict" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"aNum == %@",favCriteria];
[fetchRequest setPredicate:predicate];
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if([fetchedObjects count] > 0)
{
WordDict *slangObj = [fetchedObjects objectAtIndex:0];
slangObj.fFav = [NSNumber numberWithBool:YES];
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// Handle the error
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error!" message:@"For some reason there was a problem connecting to the database. Please restart the app and try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
- (IBAction)btnAddToFavs:(UIButton *)sender {
[self addToFav: _forRecToUpdate];
}
我在第一个代码部分中更改了一个值:
_txtMeaning.text = slang.eEnglish;
_forFavWord = slang.dWord;
_forFavToUpdate = slang.fFav;
count = (int) slang.aNum;
致:
这是有效的,因为我首先必须得到数据库中唯一字段的值,然后根据该条件进行查找。这允许我更改数据库中字段的值
现在我唯一的问题是如何刷新选择器控件。但这是另一个问题…:-)
谢谢大家的帮助。您正在使用iCloud吗?这是我唯一一次看到“主键必须是唯一的”消息。不,我不是。实际上,我使用核心数据创建了sqlite数据库,但随后使用firefox提取并填充了它。在我决定写信之前,一切都很顺利。由于我现在正在学习,我认为这是因为我完成了提取和填充过程,但我不这么认为。使用通用SQLite编辑器编辑核心数据文件是获取核心数据无法读取的文件的好方法。核心数据如何使用SQLite的内部内容没有文档记录,所以我将继续以这种方式填充它。但是,必须有一种方法来访问当前显示在pickerView中的记录,并对其中一个字段进行更改。
_txtMeaning.text = slang.eEnglish;
_forRecToUpdate = slang.aNum;