如何在不再运行应用程序的情况下反映数据库中的更改?

时间:2011-09-19 05:08:46

标签: iphone sqlite uipickerview

我(iPhone新手)正在开发一款跟踪数据使用情况(wifi,手机)的iPhone应用程序。我给了用户一个选项来添加新的计划,这些计划将被放入数据库(sqlite)的表中。 我在选择器视图中显示计划列表,并且我想在用户输入新计划后立即刷新选择器视图中的数据。截至目前,pickerview正在下次运行中更新:( 提前致谢。 代码在这里:

    actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [actionSheet addSubview:pickerView];
    plans= [[NSMutableArray alloc] init];
    NSLog(@"Data base is entering");
    NSString *path1  = [[NSBundle mainBundle] pathForResource:@"antara" ofType:@"sqlite"];
    FMDatabase *db1  = [[FMDatabase alloc] initWithPath:path1];
    [db1 open];
    FMResultSet *fResult2= [db1 executeQuery:@"SELECT * FROM main"];
    NSLog(@"fresult2 ready"); 
    while ( [fResult2 next])
    {
        planData = [fResult2 stringForColumn:@"planName"];
        [plans addObject:planData];
        NSLog(@"The data is =%@",planData);
    }
    [db1 close];
    [pickerView selectRow:1 inComponent:0 animated:NO];
    //mlabel.text= [plans objectAtIndex:[pickerView selectedRowInComponent:0]];
    //[self setCurrentPlan:[plans objectAtIndex:[pickerView selectedRowInComponent:0]]];
    //[mlabel setText:[self getCurrentPlan]];
    currentPlan= [plans objectAtIndex:[pickerView selectedRowInComponent:0]];
    [plan setText:currentPlan];
    [pickerView release];

2 个答案:

答案 0 :(得分:1)

我认为你的代码需要一些分离。试试这个并告诉我它是否有效

1)取出将数据从DB拉入单独函数的逻辑,让我们称之为loadPlans。

- (void) loadPlans {
plans= [[NSMutableArray alloc] init];
NSLog(@"Data base is entering");
NSString *path1  = [[NSBundle mainBundle] pathForResource:@"antara" ofType:@"sqlite"];
FMDatabase *db1  = [[FMDatabase alloc] initWithPath:path1];
[db1 open];
FMResultSet *fResult2= [db1 executeQuery:@"SELECT * FROM main"];
NSLog(@"fresult2 ready");

while ( [fResult2 next])
{
    planData = [fResult2 stringForColumn:@"planName"];
    [plans addObject:planData];
    NSLog(@"The data is =%@",planData);
}


[db1 close];
}

2)显然,这段代码来自你上面粘贴的函数,因此,从该函数中删除这些行。

3)在正常流程下:在调用上述函数之前调用loadPlans

4)每当您在数据库中插入内容时。再次调用这两个函数

[self loadPlans];
[PickerView reloadComponent:n];

这一切都假定计划的db条目发生在同一页面和同一个线程中,以便您可以控制它,您可以在其中调用这些函数。如果这个假设不正确,那么还要解释如何以及何时将计划添加到db中,在此处粘贴一些关于db entry的代码。

答案 1 :(得分:0)

您需要做的就是通过

触发重建正在显示的组件
[customPickerView reloadComponent:n] // where n = the index of the component

在加载完成后将触发器代码放到某处。

你也可以使用这样的东西来检查pickerView是否可见,以及你是否真的需要更新屏幕:

 if ([screenUpdateDelegate respondsToSelector:@selector(whateverIneedToDo:)]) {
         [screenUpdateDelegate whateverIneedToDo:withParameterIfYouLike];