Форум программистов, компьютерный форум CyberForum.ru

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
#1

Работа с sqlite - Программирование iOS/iPhone

27.05.2013, 12:18. Просмотров 1322. Ответов 15
Метки нет (Все метки)

Привет, ребята. У меня тут возник затык. Решил написать приложение-тест, в котором пользователь отвечает на вопросы, набирает баллы за правильные ответы и пр. Так вот, я решил вопросы и ответы запихнуть в базу данных. Создал базу .sqlite, создал там таблицу с вопросами и ответами. Я не могу понять почему, но моя функция, которая "вытягивает" вопросы из таблицы, не работает. Вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
-(NSMutableArray*) getQuestion
{
 
    NSMutableArray *questionsArray = nil;
    sqlite3_stmt* question;
    char *error;
    NSString* questionGet;
    
    id dataBasePath = [[NSBundle mainBundle] pathForResource:@"FOOTBALL" ofType:@"sqlite3"];
    const char dbPath = [dataBasePath UTF8String];
    if(sqlite3_open(dbPath, &_myBase) == SQLITE_OK)
    {
        questionGet = [NSString stringWithFormat:@"SELECT Questions FROM QuestionsAndAnswers"];
        if (sqlite3_prepare_v2(_myBase, [questionGet UTF8String], -1, &question, NULL ) == SQLITE_OK)
        {
            questionsArray = [[NSMutableArray alloc] init];
        // NSLog(@"Setup row inserted %i" ,cnt);
            while(sqlite3_step(question) == SQLITE_ROW)
            {
                [questionsArray addObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(question, 0)]];
            }
            
        }
        else
        {
            NSLog(@"Error: %s", error);
            NSLog(@"SQL: %s", [questionGet UTF8String]);
        }
    }
    else
    {
        NSLog(@"Error: %s", error);
        NSLog(@"SQL: %s", [questionGet UTF8String]);
    }
    sqlite3_finalize(question);
    sqlite3_close(_myBase);
    return [questionsArray autorelease];
}
Ребятки, уповаю на ваше милосердие, и очень надеюсь, что вы мне поможете. Искал похожую тему на форуме, и того, что мне нужно, не нашел. Заранее спасибо за помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 12:18     Работа с sqlite
Посмотрите здесь:

Objective-C Асинхронный доступ к SQLite
Objective-C Локализация sqlite файла
sqlite+xcode5 Создание теста Objective-C
SQLite вывезка данные и выложить извлеченные данные к MessageUI Objective-C
Муки выбора: core data или работа "напрямую" с sqlite

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
27.05.2013, 12:34     Работа с sqlite #2
попробуйте разобраться с CoreData, это грубо говоря ORM, которая позволяет вам работать с объектной моделью без написания sql скриптов, а делает это на фоне
http://developer.apple.com/library/m...mingGuide.html

ну это так, совет просто
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
27.05.2013, 12:41     Работа с sqlite #3
Возможно, не по теме, но...
1. Из пушки по воробьям. Для этой задачи вполне достаточно plist'а.
2. Гранаты не той системы. Core Data - наше_фсё

По теме:
Какие ошибки в лог падают? Срабатывает ли sqlite3_open(dbPath, &_myBase)?

Добавлено через 3 минуты
Оппа. А в лог-то ничего и не упадет. переменная error там для мебели стоит...
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
27.05.2013, 17:37     Работа с sqlite #4
Хм... вот так работает (правда я тестил с ARC)...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-(NSMutableArray*) getQuestion
{
    NSMutableArray *questionsArray = nil;
    sqlite3_stmt* question;
    char *error = NULL;
    NSString* questionGet;
    
    id dataBasePath = [[NSBundle mainBundle] pathForResource:@"FOOTBALL" ofType:@"sqlite3"];
    if (sqlite3_open([dataBasePath UTF8String], &_myBase) == SQLITE_OK) {
        questionGet = [NSString stringWithFormat:@"SELECT Questions FROM QuestionsAndAnswers"];
        if (sqlite3_prepare_v2(_myBase, [questionGet UTF8String], -1, &question, NULL ) == SQLITE_OK)
        {
            questionsArray = [[NSMutableArray alloc] init];
            // NSLog(@"Setup row inserted %i" ,cnt);
            while(sqlite3_step(question) == SQLITE_ROW)
            {
                [questionsArray addObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(question, 0)]];
            }
            
        }
        else
        {
            NSLog(@"Error: %s", error);
            NSLog(@"SQL: %s", [questionGet UTF8String]);
        }
        sqlite3_finalize(question);
        sqlite3_close(_myBase);
    }
    else
    {
        NSLog(@"Database failed to open.");
    }
//    return [questionsArray autorelease];
    return questionsArray;
}
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
28.05.2013, 12:12     Работа с sqlite #5
также кроме sqlite можно использовать более упрощенную структуру ввиде словаря NSMutableDictionary

который нужно будет сохранять в NSUserDefaults после изменений

применимо к относительно небольшим объемам данных ~1000 записей на словарь
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:06  [ТС]     Работа с sqlite #6
Pro2005, у меня, увы не работает

alexpac26, а NSMutableDictionary подойдет для хранения вопроса, четырех вариантов ответа и указателя на правильный ответ?

Добавлено через 16 секунд
Vorona, спасибо за совет, попытаюсь
Alex_pac
1282 / 688 / 8
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
29.05.2013, 13:09     Работа с sqlite #7
alexpac26, а NSMutableDictionary подойдет для хранения вопроса, четырех вариантов ответа и указателя на правильный ответ?
да подойдет, это называется вложенный словарь
или многомерный
также можно использовать структуры ввиде массивов словарей
то есть в NSMutableArray будут лежать NSMutableDictionary

Однако при работе с многомерными словарями сначала надо "нарисовать" их структуру например в Excel чтобы не забыть что где храниться

Работа с sqlite
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:14  [ТС]     Работа с sqlite #8
Alex_pac, хмм, выглядит очень интересно. А не могли бы вы предоставить небольшой кусочек кода, как работать с вложенным словарем? А то я гуглю, но ничего действительно подходящего найти не могу.
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:18     Работа с sqlite #9
Хм... и что разницы не видите в моем и в Вашем коде ?
У вас с XCode все в порядке, или вы не видите warning-ов в этих строчках
C#
1
2
    const char dbPath = [dataBasePath UTF8String];
    if(sqlite3_open(dbPath, &_myBase) == SQLITE_OK)
Замените их на
C#
1
if (sqlite3_open([dataBasePath UTF8String], &_myBase) == SQLITE_OK)
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:21  [ТС]     Работа с sqlite #10
Pro2005, я так и поступил, но когда я пытаюсь вывести содержание массива хотя бы в лог, программа фэйлит ( Только вот не пойму, из-за чего? Неправильный вывод данных? База открывается, но не наполняется данными? Открывается ли она вообще? Много неопределенности из-за банального отсутствия опыта

Добавлено через 46 секунд
mobidevelop, А подскажите, что я делаю не так в использовании переменной error? Как мне ее применять, чтобы от нее был прок?
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:27     Работа с sqlite #11
Вот... держите
https://dl.dropboxusercontent.com/u/...9/testSql2.zip
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
29.05.2013, 13:29     Работа с sqlite #12
Цитата Сообщение от Noobass Посмотреть сообщение
mobidevelop, А подскажите, что я делаю не так в использовании переменной error? Как мне ее применять, чтобы от нее был прок?
Ну, последний раз я с SQLite напрямую очень давно работал, подробностей не помню. Но вроде как большинство его функций возвращают код ошибки. Вот его-то и надо анализировать. А error сейчас просто балластом болтается. Значение-то у нее не меняется нигде.
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:32  [ТС]     Работа с sqlite #13
Pro2005, Спасибо за исходник. Оно, конечно, билдится, но на экран ничего не выводит ( Может, я что-то не так делаю...
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:49     Работа с sqlite #14
выводиться в консоль
Alex_pac
1282 / 688 / 8
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
29.05.2013, 14:00     Работа с sqlite #15
1) нужен сиглтон, чтобы можно в любом месте кода внезапно запросить ваш "словарь"

1.1) в дополнение сингтон может содержать макрос экспресс доступа

пример сингтона с базой ввиде NSUserDefaults словаря
mysingleton.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import <Foundation/Foundation.h>
 
// глобальная видимость класса задана через файл Supporting Files/test_singleton-Prefix.pch
 
#define singleton [mysingleton getInstance] // макрос экспресс доступа
 
@interface mysingleton : NSObject
 
+(mysingleton*) getInstance;
 
@property NSMutableDictionary *base;
 
-(void) save; // процедура сохранения данных
 
@end
mysingleton.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import "mysingleton.h"
 
@implementation mysingleton
 
static mysingleton* mysingleton_st;
 
+(mysingleton*) getInstance {
    if (mysingleton_st == nil) {
        mysingleton_st = [mysingleton new];
        
        
        NSUserDefaults *nsu = [NSUserDefaults standardUserDefaults];
        
        // проверяем наличие базы
        if (![nsu objectForKey:@"base"]) {
            // база не обнаружена
            mysingleton_st.base = [NSMutableDictionary new];
            [nsu setObject:mysingleton_st.base forKey:@"base"];
        } else {
            // обнаржуена база
            mysingleton_st.base = [nsu objectForKey:@"base"];
            // мутируем словарь полностю (все вложенные словари и объекты мутируются)
            mysingleton_st.base = CFBridgingRelease(CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFPropertyListRef)(mysingleton_st.base), kCFPropertyListMutableContainers));
        }
    }
    return mysingleton_st;
}
 
-(void)save {
    NSUserDefaults *nsu = [NSUserDefaults standardUserDefaults];
    
    [nsu setObject:_base forKey:@"base"];
    [nsu synchronize]; // <<- данные сохранены
    
}
 
@end
последующие запросы к базе будут в формате

Objective-C
1
[singleton.base setObject:%object% forKey: %key%];
и тп

2) поскольку словарь имеет сложную структуру то с сингтоне можно выделить дополнительные ссылки на узлы словаря которые будут видимы в любом месте приложения вне зависимости от контроллера
Вложения
Тип файла: zip test_singleton.zip (79.1 Кб, 1 просмотров)
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 14:04  [ТС]     Работа с sqlite #16
Alex_pac, Спасибо! Сейчас попробую разобраться
Yandex
Объявления
29.05.2013, 14:04     Работа с sqlite
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru