Несколько запросов в SQLite для iOS - PullRequest
1 голос
/ 28 июля 2011

Нужна помощь здесь.

мне удалось заставить drinkName и категории работать. http://dl.dropbox.com/u/418769/2.png

но мне нужно различить категории и получить значение счетчика базы данных SQL.

что-то вроде этого http://dl.dropbox.com/u/418769/2.png, а затем это http://dl.dropbox.com/u/418769/3.png

как бы мне нужно было это сделать?

мне нужно запустить SELECT drinkID, drinkName из напитков,

ВЫБЕРИТЕ РАЗЛИЧНЫЕ категории из напитков &

сосчитать ряд каждой категии .. можно ли это сделать?

это моя база выглядит как .. http://dl.dropbox.com/u/418769/4.png

Я слежу за этим http://mybankofknowledge.wordpress.com/2010/12/01/accessing-sqlite-from-iphone-table-view/

хорошо, это вроде работает ..... я на этой ошибке

* Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '* - [NSMutableArray objectAtIndex:]: индекс 5 за пределами [0 .. 4]'

  • (void) getInitialDataToDisplay: (NSString *) dbPath { DrinkTabsAndNavAppDelegate * appDelegate = (DrinkTabsAndNavAppDelegate *) [[UIApplication sharedApplication] делегат];

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

    const char *sql = "SELECT drinkID, drinkName FROM drinks";
    //const char *sql = "SELECT drinkName, categories FROM drinks";
    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);
            Drink *drinkObj = [[Drink alloc] initWithPrimaryKey:primaryKey];
            drinkObj.drinkName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,1)]; 
            //drinkObj.categories = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];
    
            drinkObj.isDirty = NO;
            [appDelegate.drinksArray addObject:drinkObj];
            [drinkObj release];
        }
    
    
    }
    

    } else sqlite3_close (база данных); // закрыть дб, чтобы освободить всю память }

  • (void) getCategory: (NSString *) dbPath { DrinkTabsAndNavAppDelegate * appDelegate = (DrinkTabsAndNavAppDelegate *) [[UIApplication sharedApplication] делегат];

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

    const char *sql = "SELECT DISTINCT category FROM drinks";
    //const char *sql = "SELECT drinkName, categories FROM drinks";
    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);
            Drink *catObj = [[Drink alloc] initWithPrimaryKey:primaryKey];
            catObj.category = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];   
            //drinkObj.categories = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];
            NSLog(@"run here");
            catObj.isDirty = NO;
            [appDelegate.categoryArray addObject:catObj];
            [catObj release];
        }
    
    
    }
    

    } else sqlite3_close (база данных); // закрыть дб, чтобы освободить всю память }

Ответы [ 3 ]

2 голосов
/ 29 июля 2011

Если вы хотите подсчитать количество напитков в каждой категории:

           select category, count(drinkid) as DrinksInThisCategory
           from drinks
           group by category

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

1 голос
/ 29 июля 2011

Я бы, вероятно, пошел с подходом, который использовал NSMutableDictionary вместо массива в качестве основной структуры данных.

-(void) addDrink:(Drink) drink
{
  //_drinks has been initialised earlier and is of type NSMutableDictionary
  NSMutableArray categoryDrinks = [_drinks objectForKey:drink.categories];
  if (categoryDrinks == nil)
  {
    categoryDrinks = [[[NSMutableArray alloc] init] autorelease];
    [_drinks setObject:categoryDrinks forKey:drink.categories];
  }

  [categoryDrinks addObject:drink];
}

Это имитирует структуру, которую вы показываете на своих изображениях, количество предметов в каждой категории теперь можно узнать, позвонив по номеру [[_drinks objectForKey:categoryName] count].Посмотрите на яблочную документацию для NSMutableDictionary и NSMutableArray

Если вы просто хотите, чтобы числа были SQL GROUP BYВыражение, которое вы можете получить для подсчета категорий, делая что-то вроде этого

ВЫБЕРИТЕ CategoryColName, COUNT (CategoryColName) FROM TableName GROUP BY CategoryColName

Это даст вам пары с названием вашей категории и количеством

Один небольшой совет, в вашем Drinks объекте вы используете свойство categories.Я всегда стараюсь синхронизировать множество имен с типом данных.Это означает, что я использую множественное число только для чего-то, если это коллекция сортов.В противном случае я использую единственное число, это может быть расширено до столбцов SQL, в то время как столбец содержит категории всех напитков.Это все еще только одна категория на напиток.Вы назвали другие столбцы в единственном числе.

1 голос
/ 29 июля 2011

Есть два способа, которыми я могу придумать, один из них запрашивает вашу базу данных: SELECT drinkID FROM drinks where categories='catX' один раз для каждой категории, а затем подсчитывать строки каждого. Я думаю, что это может быть достигнуто с помощью некоторого кода SQLite, чтобы вернуть все значения одним запросом.

Другой способ - использовать вас appDelegate.drinksArray. Сначала упорядочите запрос по categories, затем вы можете использовать предикат, почти такой же, как приведенный выше, и использовать FOR drink IN drinksArray (здесь псевдокод ...), чтобы подсчитать, сколько напитков в каждой категории.

С точки зрения производительности, я думаю, что лучший способ - использовать sql для запросов как напитков, так и количества в каждой категории, может быть в двух разных запросах, лучший в одном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...