写入核心数据文件

时间:2014-03-28 02:11:57

标签: core-data xcode5

我是xcode的新手,因此是Objective-c。现在写我的第一个应用程序,呜呜! :-)该应用程序应该是一本字典。我在写入核心数据sqlite数据库中的字段时遇到问题。我的表叫做WordDict,字段是; aNum(string),bLetter(string),cCategory(string),dWord(string),eEnglish(string)和fFav(BOOL)。

我能够将数据读入pickerView控件,并在textView中显示与pickerView中的行对应的信息。但是,我希望一旦一个单词及其含义分别在pickerView和textView中,我可以单击一个按钮,(btnAddToFav),BOOL YES将更新到pickerView中显示的当前记录的fFav字段

我尝试了一些事情,但不知道如何将fFav的当前字段的值从fetchedResultController传递给更新字段的按钮操作。

我尝试了一些使程序崩溃几次并出现一些错误的事情:coredata error(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

任何想法??

感谢您提供任何帮助。

此致 Socaprice

好的,我让这个工作了。我添加了以下代码:

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

为:

_txtMeaning.text = slang.eEnglish;
_forRecToUpdate = slang.aNum;

这是有效的,因为我首先必须获得数据库中唯一字段的值,然后找到该标准。这允许我更改数据库中字段的值。

现在我唯一的问题是如何刷新选择器控件。但那是另一个问题......: - )

感谢大家的帮助。

0 个答案:

没有答案