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

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

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

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

27.05.2013, 12:18. Просмотров 1375. Ответов 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];
}
Ребятки, уповаю на ваше милосердие, и очень надеюсь, что вы мне поможете. Искал похожую тему на форуме, и того, что мне нужно, не нашел. Заранее спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 12:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с sqlite (Программирование iOS):

Муки выбора: core data или работа "напрямую" с sqlite - Программирование iOS
Здравствуйте! Я новичок в разработке под osx и ios, но так как база на сях и плюсах была (когда-то давно), то идет это дело у меня довольно...

Локализация sqlite файла - Objective-C
Здравствуйте, делаю локализацию своего приложения, со строками все ок, а вот с базой данной проблема, справа в файл менеджере на файле базы...

Асинхронный доступ к SQLite - Objective-C
Собственно, сабж. Я знаю, что SQLite не поддерживает много поточность, и нужно использовать локи. Но вот как будет правльно организовать...

sqlite+xcode5 Создание теста - Objective-C
Доброго времени суток, я начинающий программист, мне нужно создать приложение, тест типа 1 вопрос и 5 вариантов ответа и один из них...

SQLite вывезка данные и выложить извлеченные данные к MessageUI - Objective-C
Всем привет господа. У меня есть проблемка что не смог сделат, может кто нибудь поможет. вот код #import...

Работа с SQLite - Java БД
Здравствуйте, я делаю курсовую работу на java, моя тема "Домашняя бухгалтерия". Не подскажите как мне организовать мою БД, какие там должны...

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

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

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

Добавлено через 3 минуты
Оппа. А в лог-то ничего и не упадет. переменная error там для мебели стоит...
1
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
27.05.2013, 17:37 #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;
}
0
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
28.05.2013, 12:12 #5
также кроме sqlite можно использовать более упрощенную структуру ввиде словаря NSMutableDictionary

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

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

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

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

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

Работа с sqlite
1
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:14  [ТС] #8
Alex_pac, хмм, выглядит очень интересно. А не могли бы вы предоставить небольшой кусочек кода, как работать с вложенным словарем? А то я гуглю, но ничего действительно подходящего найти не могу.
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:18 #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)
0
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:21  [ТС] #10
Pro2005, я так и поступил, но когда я пытаюсь вывести содержание массива хотя бы в лог, программа фэйлит ( Только вот не пойму, из-за чего? Неправильный вывод данных? База открывается, но не наполняется данными? Открывается ли она вообще? Много неопределенности из-за банального отсутствия опыта

Добавлено через 46 секунд
mobidevelop, А подскажите, что я делаю не так в использовании переменной error? Как мне ее применять, чтобы от нее был прок?
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:27 #11
Вот... держите
https://dl.dropboxusercontent.com/u/25556589/testSql2.zip
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
29.05.2013, 13:29 #12
Цитата Сообщение от Noobass Посмотреть сообщение
mobidevelop, А подскажите, что я делаю не так в использовании переменной error? Как мне ее применять, чтобы от нее был прок?
Ну, последний раз я с SQLite напрямую очень давно работал, подробностей не помню. Но вроде как большинство его функций возвращают код ошибки. Вот его-то и надо анализировать. А error сейчас просто балластом болтается. Значение-то у нее не меняется нигде.
0
Noobass
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 13:32  [ТС] #13
Pro2005, Спасибо за исходник. Оно, конечно, билдится, но на экран ничего не выводит ( Может, я что-то не так делаю...
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 13:49 #14
выводиться в консоль
0
Alex_pac
1285 / 691 / 8
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
29.05.2013, 14:00 #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) поскольку словарь имеет сложную структуру то с сингтоне можно выделить дополнительные ссылки на узлы словаря которые будут видимы в любом месте приложения вне зависимости от контроллера
1
Вложения
Тип файла: zip test_singleton.zip (79.1 Кб, 1 просмотров)
29.05.2013, 14:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 14:00
Привет! Вот еще темы с ответами:

Работа с SQLite - Windows Phone
Дорогие ребята, уже много часом, нет даже дней, провел в поисках доходчивого примера как работать с базой данных SQLite. Вы моя последняя...

.NET 3.x Работа с SQLite - C#
В приложении нужна база данных без дополнительных установок ПО. Выбор пал SQLite. И так нашел в интернете FAQ по ней: тык И так я...

Работа с SQLite - C++
Хочу начать работать с SQLite, вот попробовал, но появилась ошибка, подскажите в чем проблема и как исправить, или посоветуйте другие...

Работа с SQLite - C++ Qt
Здравствуйте! Функция подключения к БД у меня выглядит следующим образом: static bool createConnection () { QSqlDatabase db =...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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