Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Noobass
0 / 0 / 13
Регистрация: 15.10.2012
Сообщений: 100
#1

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

27.05.2013, 12:18. Просмотров 1463. Ответов 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
Здравствуйте! Я новичок в разработке под osx и ios, но так как база на сях и...

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

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

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

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

Работа с SQLite
Привет, надо сделать одно приложение, я прочитал что SQLite работает...

15
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 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 / 4
Регистрация: 20.01.2013
Сообщений: 125
28.05.2013, 12:12 #5
также кроме sqlite можно использовать более упрощенную структуру ввиде словаря NSMutableDictionary

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

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

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

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

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

Работа с sqlite
1
Noobass
0 / 0 / 13
Регистрация: 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 / 13
Регистрация: 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 / 13
Регистрация: 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
1291 / 697 / 107
Регистрация: 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 просмотров)
Noobass
0 / 0 / 13
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 14:04  [ТС] #16
Alex_pac, Спасибо! Сейчас попробую разобраться
0
29.05.2013, 14:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 14:04
Привет! Вот еще темы с решениями:

Работа с SQLite
Добрый день. Я новичок в разработке под андроид и экспериментируя натолкнулся...

Работа с SQLite
Здравствуйте, я делаю курсовую работу на java, моя тема &quot;Домашняя бухгалтерия&quot;....

Работа с SQLite
Здравствуйте, я делаю курсовую работу на java, моя тема &quot;Домашняя бухгалтерия&quot;....

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


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

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

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