Запрос массива SQLite после обновления - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть приложение панели вкладок с 2 UITableViews. На вкладке 1 у меня есть UITableView, заполненный массивом объектов Todo из базы данных Sqlite. Каждый объект Todo имеет статус, который может быть обновлен кнопкой в ​​подробном представлении; 'complete' или 'in progress' - тогда база данных SQlite обновляется на '1', если объект Todo был помечен как 'complete', или на '0', если он помечен как 'в процессе'. Я думаю, это прекрасно работает (хотя после выхода из приложения оно не сохраняется).

Однако на вкладке 2 у меня есть другой UITableView, в котором я хочу показать только элементы, помеченные как завершенные.

Для этого потребуется еще один отдельный вызов Sqlite (выберите * из todo, где complete = '1'), а затем отдельный массив объектов TodoFav для заполнения таблицы во вкладке 2? Если так, то как Tab 2 узнает, что Tab 1 обновлен и сохранен? - Я думаю, что в настоящее время это экономит только на выходе (хотя опять же, похоже, это не сохраняется после выхода).

Любая помощь будет оценена, я был Lurker некоторое время теперь, и искал долго и упорно для ответа без толка! Большое спасибо.

Редактировать

Обезвоживание кода для сохранения обновления при выходе:

- (void) dehydrate {
if (dirty) { // If the todo is “dirty” meaning the dirty property was set to YES, we will need   to save the new data to the database.
if (dehydrate_statment == nil) {
    const char *sql = "UPDATE todo SET priority = ?,complete =? WHERE pk=?";
    if (sqlite3_prepare_v2(database, sql, -1, &dehydrate_statment, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }
}
// Bind our variables to each of the “?”‘s.  Notice the order.  
// The numbers represent the question marks from left to right (1 being the first, 2 being the second, 3 being the third)
sqlite3_bind_int(dehydrate_statment, 3, self.primaryKey);
sqlite3_bind_int(dehydrate_statment, 2, self.status);
sqlite3_bind_int(dehydrate_statment, 1, self.priority);
int success = sqlite3_step(dehydrate_statment);

if (success != SQLITE_DONE) {
    NSAssert1(0, @"Error: failed to save priority with message '%s'.", sqlite3_errmsg(database));
}
sqlite3_reset(dehydrate_statment);
dirty = NO;
}       
}

И код кнопки, которую нужно изменить, чтобы завершить:

- (void)updateStatus:(NSInteger)newStatus {
self.status = newStatus;
dirty = YES;     // Signifies that the todo has been altered and will need to be saved to the database.
}

Попытка запроса базы данных во второй раз для «завершенных» (status = '1') элементов:

- (NSMutableArray *)todosComplete {

NSMutableArray *todoCompleteArray = [[NSMutableArray alloc] init];
self.todosComplete = todoCompleteArray;
[todoCompleteArray release];

NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
NSString *query = @"select * from todo where status='1'";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        int primaryKey = sqlite3_column_int(statement, 0);
        TodoComplete *tdC = [[TodoComplete alloc] initWithPrimaryKey:primaryKey database:database];
        [todosComplete addObject:tdC];
        [tdC release];
    }
    sqlite3_finalize(statement);
}
return retval;
* *} Тысяча двадцать-один

Последнее, инициализация в делегате приложения, кажется, работает нормально:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.

[self createEditableCopyOfDatabaseIfNeeded];
[self initializeDatabase];
//[self initializeDatabaseFiltered];

// Add the navigation controller's view to the window and display.
[self.window addSubview:navigationController.view];
[self.window addSubview:tabController.view];
[self.window makeKeyAndVisible];

return YES;

}

Еще раз спасибо !!! Извините за длинный пост, очень ценю любую помощь. Я знаю, что упускаю что-то очевидное - обезвоживание должно быть мгновенным для начала? И я, вероятно, неправильно запрашиваю БД для отфильтрованных элементов или чего-то такого!?

1 Ответ

0 голосов
/ 05 апреля 2011

Я не эксперт в sqlite, но способ, которым вы экономите, кажется слишком запутанным.Я думаю, что вы могли бы сделать что-то вроде следующего, когда кнопка сохранения нажата (это не проверено, мне нужно немного исправить синтаксис, и у меня есть «buttonState» там, чтобы указать, 0 или 1 до нажатия кнопки, поэтому настройтечто соответственно ... также предполагается, что строка == первичный ключ, так что, вероятно, потребуется корректировка).Я также не уверен, существует ли открытое соединение с базой данных между методами (я не говорю, что нет, просто я не знаю), поэтому, когда вы вспоминаете законченные результаты, может потребоваться открыть соединение с БД [и вызакрыл бы его последним методом, который его открыл]: * ​​1001 *

-(void)didPushButton{
    //something to identify which indexPath.row held the button that was selected
    sqlite3 *pref = [self getNewDBConnection];
    sqlite3_stmt *progStatement = nil;
    NSString *setProg = [NSString stringWithFormat:@"UPDATE todo SET complete=%d WHERE pk=%d",-buttonState+1,indexPath.row];
    char * errorMsg2;
    if(sqlite3_exec(pref,[setProg UTF8String],NULL,NULL,&errorMsg2)!=SQLITE_OK)
    {NSLog(@"error setting completion");} 
    else {NSLog(@"set status for pk:%d",indexPath.row);}
    sqlite3_finalize(progStatement);
    sqlite3_close(pref);
    buttonState=-buttonState+1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...