Core data 写入核心数据文件

Core data 写入核心数据文件,core-data,xcode5,Core Data,Xcode5,我对xcode是完全陌生的,因此是objective-c。现在正在编写我的第一个应用程序,呜呜!:-)这个应用程序应该是一本字典。我在写入核心数据sqlite数据库中的字段时遇到问题。我的表名为WordDict,字段为;aNum(字符串)、bLetter(字符串)、cCategory(字符串)、dWord(字符串)、eEnglish(字符串)和fFav(布尔) 我能够将数据读入pickerView控件,并在文本视图中显示与pickerView中的行相对应的信息。但是,我希望,一旦一个单词及其含义

我对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

我已经不知所措了,并不是说我一开始就有很多事情要做:-)。下面是我的一些代码:

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