Данные SQLite, показывающие - PullRequest
       1

Данные SQLite, показывающие

7 голосов
/ 25 февраля 2012

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

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

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

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

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

База данных Coffee выглядит как =

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 (понедельник), а затем отобразить все элементы, которые содержат 'dayoftheweek monday'

Мой 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

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

я пытался;

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)

/ * begin* / if ([CoffeeObj.dayoftheweek isEqualToString: @ "Monday"]) {

        //  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]];

Ответы [ 3 ]

1 голос
/ 19 августа 2012

Если я правильно понимаю, ваша проблема не столько в 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];
} 

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

Ваш текущий подход, вероятно, не работает, потому что методы 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 и некоторый пример кода, который также охватывает именно вашу проблему.

1 голос
/ 19 августа 2012

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

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

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

Подробнее о базовых данных:

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

0 голосов
/ 18 августа 2012

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

// 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...