2012-02-25 2 views
7

Я совершенно новый с SQLite. У меня есть UITableview, в котором есть разные дни. (Понедельник до воскресенья). Когда я нажимаю, например, в понедельник, другой узел просмотра содержит также UITableview внутри него. В том же viewcontroller у меня есть UIButton, когда я нажимаю на него, я могу добавить данные в мою базу данных SQLite [A], я вставляю имя и день недели (день недели в этом примере " понедельник », потому что я нажал на контроллер понедельника).Данные SQLite, показывающие

Когда я ввожу имя, оно появляется в моем столе. Но когда я возвращаюсь к своему первому диспетчеру просмотра со днями, и я, например, нажимаю, например, в среду, данные, которые я добавил, также появляются там.

Так что мой вопрос; Как я могу показать имя, которое я вставленный в понедельник, только в Tableview понедельник, а не в другие дни (tableviews)

Дополнительная информация:

Таким образом, когда пользователь добавляет имя в «понедельник» отправляю dayoftheweek с добавленным именем в базе данных SQLite, когда пользователь добавляет имя в среду я отправить 'dayoftheweek' среда и т.д ..

База данных Кофе выглядит =

CoffeeName | dayoftheweek 
------------------------- 
Hello world | Monday 
Hello Planet | Wednesday 
Hello Animal | Monday 
Hello STOVW | Friday 

[A] const char *sql = "insert into Coffee(CoffeeName, dayoftheweek) Values(?, ?)";

мне нужно проверить, если день (например) понедельник такая же, как dayoftheweek (понедельник), а затем отобразить Al элементы, которые содержит «dayoftheweek понедельник»

Моя SQLite выглядит следующим образом:

+ (void) getInitialDataToDisplay:(NSString *)dbPath { 


    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 


     const char *sql = "select coffeeID, coffeeName from coffee"; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 

      while(sqlite3_step(selectstmt) == SQLITE_ROW) { 

       NSInteger primaryKey = sqlite3_column_int(selectstmt, 0); 
       Coffee *coffeeObj = [[Coffee alloc] initWithPrimaryKey:primaryKey]; 
       coffeeObj.LessonName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; 

       coffeeObj.dayoftheweek = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; 

       coffeeObj.isDirty = NO; 

       [appDelegate.coffeeArray addObject:coffeeObj]; 
      } 
     } 
    } 
    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 


- (void) addCoffee1 { 


    if(addStmt == nil) { 
     const char *sql = "insert into Coffee(CoffeeName, dayoftheweek) Values(?, ?)"; 
     if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
    } 



    sqlite3_bind_text(addStmt, 1, [dayoftheweek UTF8String], -1, SQLITE_TRANSIENT); 

    if(SQLITE_DONE != sqlite3_step(addStmt)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid 
     LesID = sqlite3_last_insert_rowid(database); 

    //Reset the add statement. 
    sqlite3_reset(addStmt); 
} 

Вставка:

coffeeObj.dayoftheweek = [NSString stringWithFormat:@"%@", dayoftheweek]; 

эта вставка: monday tuesday wednesday thursday friday saturday or sunday

Но как я могу отобразить т данные, которые вставляются в понедельник в виде понедельника и данные, которые вводятся во вторник в контроллере вторжения и т. д.

i try;

if([coffeeObj.dayoftheweek isEqualToString:@"Monday"]) { 

cell.day.text = coffeeObj.LessonName; 


} else { 

} 

Дисплей:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CustomCellIdentifier = @"DaycusViewController"; 
    DaycusViewController *cell = (DaycusViewController *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; 


    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DaycusViewController" 
                owner:self options:nil]; 
     for (id oneObject in nib) if ([oneObject isKindOfClass:[DaycusViewController class]]) 
      cell = (DaycusViewController *)oneObject; 
    } 


    //Get the object from the array. 
    Coffee *coffeeObj = [appDelegate.coffeeArray objectAtIndex:indexPath.row]; 



    cell.Name.text = CoffeeObj.CoffeeID; 
    cell.Day.text = CoffeeObj.dayoftheweek; 


    //i tried this: (not working) 

/* начать */ если ([CoffeeObj.dayoftheweek isEqualToString: @ "понедельник"]) {

 // cell.Name.text = CoffeeObj.CoffeeID; 
    //cell.Day.text = CoffeeObj.dayoftheweek; 

    } else { 

    } 
    /* end */ 

//it need's to display in this example only things where dayoftheweek is monday but. 
    return cell; 
} 

вызов функции getInitialDataToDisplay

//Copy database to the user's phone if needed. 
[self copyDatabaseIfNeeded]; 

//Initialize the coffee array. 
NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
self.coffeeArray = tempArray; 
[tempArray release]; 

//Once the db is copied, get the initial data to display on the screen. 
[Coffee getInitialDataToDisplay:[self getDBPath]]; 
+2

Говоря как кто-то, кто переехал из Интернета на мобильный, и использовал SQLite3 для модели подкачки моего первого приложения, вам действительно стоит рассмотреть возможность использования [Core Data] (http://developer.apple.com/library/ios/# DOCUMENTATION/DataManagement/Conceptual/iPhoneCoreData01/Introduction/Introduction.html) Это полностью сдувает SQLite (и использует его в качестве резервного хранилища, если хотите) с тем, насколько он эффективен и встроен. – Josh

+0

Я думаю, что проблема с этим вопросом - это сам вопрос, его действительно трудно понять, что вы хотите. –

+0

@ Leandro i обновил сообщение – Frenck

ответ

1

Трудно понять ваш вопрос, но я думаю, что вы можете лучше открыть новый проект и начать с Core Data. Это легко понять, и это быстрее, чем SQLite.

Основные данные - это инфраструктура, которую Apple предоставляет разработчикам, которые описываются как «управляемое схемой управление графами объектов и постоянство». Что это значит? Структура управляет тем, где хранятся данные, как они хранятся, кэширование данных и управление памятью. Он был перенесен на iPhone из Mac OS X с выпуском 3.0 iPhone SDK.

API базовых данных позволяет разработчикам создавать и использовать реляционную базу данных, выполнять проверку записей и выполнять запросы с использованием условий SQL-less. Это по существу позволяет взаимодействовать с SQLite в Objective-C и не придется беспокоиться о связи или управления схемой базы данных

Подробнее о Core Data:

Желаю вам удачи в вашем приложении, но я уверен, что Core Data является лучшим для ваше приложение!

0

Я никоим образом не специалист по объектив-с, но может ли это работать?

// Pass dayoftheweek to the function 
(void) getInitialDataToDisplay:(NSString *)dbPath:(NSString *)dayoftheweek { 
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

    const char *sql = "select coffeeID, coffeeName from coffee where dayoftheweek = ?"; 
    sqlite3_stmt *selectstmt; 
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 
     // Pass dayoftheweek to the query 
     sqlite3_bind_text(addStmt, 1, [dayoftheweek UTF8String], -1, SQLITE_TRANSIENT); 
     // Rest of the code, now the query will only return the data for the specified day 
+0

спасибо за ответ, но «где dayoftheweek =?», Но мне нужно отобразить его в UITableview, он должен быть статусом if, который, я думаю, я обновляю первый пост, просто дайте мне секунду – Frenck

1

Если я правильно понимаю, ваша проблема не столько о SQLite, но гораздо больше о том, как соединять контроллеры просматривать правильно.

Когда пользователь выбирает один из дней вашего первого UITableViewController, вы должны передать информацию о выборе на следующий контроллер представления. Предполагая, что вы не используете раскадровки это вероятно, будет выглядеть примерно так:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 
DaycusViewController *viewController = [[DaycusViewController alloc] initWithStyle:UITableViewStylePlain]; 
viewController.selectedDay = [days objectAtIndex:indexPath.row]; 
[[self navigationController] pushViewController:viewController animated:YES]; 
[viewController release]; 
} 

Как вы теперь имеющуюся информацию, которая COFFEES вы хотите отобразить (например, те, для «понедельник») в вашем втором контроллере представления вы можете например, то, что предложил Диего и соответствующим образом фильтровать ваши данные.

Ваш текущий подход не, вероятно, не работает, потому что методы UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

и

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

зависят друг от друга. Поэтому вы должны быть последовательны здесь. Первая (... cellForRowAtIndexPath ...) будет вызываться для каждой строки, которую вы хотите отобразить, как вы указали во втором (... numberOfRowsInSection ...).

Так что если вы сказали, что у вас было 4 строки для отображения, это будет называться четыре раза. То, что вы не можете сделать, это использовать оператор if в ... cellForRowAtIndexPath ..., чтобы просто вернуть меньше четырех строк. Вместо этого у вас должна быть коллекция кофе за этот конкретный день (в идеале выходящий из вашей модели данных ...). Вы можете использовать размер коллекции для ... numberOfRowsInSection ... способом, а затем возвращают соответствующий элемент для каждой строки, используя путь индекса в ... cellForRowAtIndexPath ... метод, как это:

Coffee c = [coffees objectAtIndex: indexPath.row] 
cell.name.text = c.name; 

Есть несколько довольно хороших примеров в Apple's documentation и пример кода, который также охватывает вашу проблему.

Смежные вопросы