как отразить изменения в базе данных без повторного запуска приложения? - PullRequest
0 голосов
/ 19 сентября 2011

Я (новичок в iPhone) разрабатываю приложение для iPhone, которое отслеживает использование данных (Wi-Fi, сотовая связь).Я даю пользователю возможность добавлять новые планы, которые будут помещены в таблицу в базе данных (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 ]

1 голос
/ 19 сентября 2011

Я думаю, вам нужно разделить код.Попробуйте это и скажите мне, если это работает

1) Извлеките логику переноса данных из БД в отдельную функцию, назовем ее 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];

Все это предполагает, что запись в БД плана происходит на той же странице и в одной и той же ветке, так что вы можете контролировать ее, где вы можете вызывать эти функции,Если это предположение не соответствует действительности, то также объясните, как и когда планы добавляются в базу данных, вставьте здесь немного кода о записи в базу данных.

0 голосов
/ 19 сентября 2011

все, что вам нужно сделать, это запустить восстановление компонентов, которые вы показываете, по

[customPickerView reloadComponent:n] // where n = the index of the component

поместите код триггера куда-нибудь после окончания загрузки.

Вы также можете использовать что-то вроде этого, чтобы проверить, виден ли pickerView и действительно ли вам нужно обновить экран:

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