Форум программистов, компьютерный форум, киберфорум
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100

Не получается открыть Базу Данных

29.05.2013, 16:55. Показов 1263. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, форумчане! Я тут недавно задавал вопрос о том, как подключить базу данных к приложению. Завалили вы меня инфой по самые помидоры, и я, конечно, все варианты еще не испробовал (ибо многие пути требуют большой реконструкции логики приложения, а мне это не нравится, так как я чайник еще). Но, я тут покумекал и понял некоторые свои ошибки. Я написал функцию инициализации базы данных, которая подключает базу к приложению, ну а если ее нет, то она "вытягивает ее из ресурсника. Вот код:

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
-(void) initDataBase
{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"FOOTBALL"];
 
 dataBaseFullPath = databasePath;
 
 // Check to see if the database file already exists
 bool databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
 
    databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
    if (!databaseAlreadyExists)
    {
        NSArray *pathsDB = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
        NSString* documentsDir = [pathsDB objectAtIndex:0];
        
        NSString *storePath = [documentsDir stringByAppendingPathComponent: @"FOOTBALL.sqlite"];
        
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        if (![fileManager fileExistsAtPath:storePath])
        {
            
            NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"FOOTBALL" ofType:@"sqlite3"];
            if (defaultStorePath) {
                [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
            }
        }
    }
    
}
Проблема в том, что функция не может достучаться до базы и идет во внутренний блок
C#
1
2
if (!databaseAlreadyExists)
    {
где тоже не может ее найти В итоге - FAIL.

Так вот, я думаю, что может я просто неправильно подключаю базу? Может неверно формирую свой запрос? В чем именно моя ошибка?

З.Ы.: Да, я знаю - есть CoreData и все такое, но опять же - я потратил немного времени на изучение этого фрэймворка, там немного своя логика, что требует начать все с нуля. Ну а мне так все до конца довести хочется Очень надеюсь на вашу помощь, отзывчивые форумчане
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2013, 16:55
Ответы с готовыми решениями:

Не получается прочитать Базу Данных из ресурсов приложения
Вот функция: -(void) initDataBase { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,...

Не получается открыть базу данных
Добрый день! Агентом нужно открыть базу и скопировать определенные значения полей в документы текущей БД. Проблема возникает сразу на...

Открыть базу данных
Доброй ночи, форумчане. 2 года назад создала базу данных не помню где. Но я точно помню, что я создавала пакеты (PACKAGE) Я все это...

6
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 17:07
Ты упускаешь расширение файла
C#
1
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"FOOTBALL"];
Вот более правильный код:
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
-(void) initDataBase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbFileName = @"FOOTBALL.sqlite3";
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:dbFileName];
    
    dataBaseFullPath = databasePath;
    // Check to see if the database file already exists
    bool databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
    
    databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
    if (!databaseAlreadyExists)
    {
        NSArray *pathsDB = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
        NSString* documentsDir = [pathsDB objectAtIndex:0];
        
        NSString *storePath = [documentsDir stringByAppendingPathComponent:dbFileName];
        
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        if (![fileManager fileExistsAtPath:storePath])
        {
            
            NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:[dbFileName stringByDeletingPathExtension] ofType:[dbFileName pathExtension]];
            if (defaultStorePath) {
                [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
            }
        }
    }
    
}
Добавлено через 1 минуту
В одном месте :
C#
1
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"FOOTBALL"];
В другом :
C#
1
NSString *storePath = [documentsDir stringByAppendingPathComponent: @"FOOTBALL.sqlite"];
Ну и еще вот так :
C#
1
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"FOOTBALL" ofType:@"sqlite3"];
Ты уж определись с расширением....
1
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 17:11  [ТС]
Pro2005, все равно не работает (( Когда ставлю брекпоинт, вижу, что прога заходит в блок "если база не найдена", и потом пропускает блок "если база открыта". Блин, я уже столько времени парюсь с этой БД, что уж очень хочется ругаться
0
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 17:14
Я не могу понять что ты ожидаешь от этого метода...
Этот метод проверяет если в Documents документ FOOTBALL.sqlite3... если нет он его копирует из Bundle - вот и все... Т.е при самом первом запуске на девайсе, будет выполнен этот if
C#
1
if (!databaseAlreadyExists)
При последующих - уже не будет, т.к в папке Documents уже будет файл FOOTBALL.sqlite3
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 17:15  [ТС]
Pro2005, Хорошо, тогда как мне сделать так, чтобы связать базу данных с приложением?
Видимо, простой функции sqlite3_open для этого недостаточно ((
0
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
29.05.2013, 17:21
sqlite3_open - ты должен передать полный путь к БД
если работаешь внутри Bundle - то в БД нельзя вносить изменения (read-only)
если скопируешь БД в Documents - то туда можно еще и делать записи....
Пройдись по своему коду... там где ты выполняешь sqlite3_open - и посмотри правильный ли путь к БД ты передаешь... Воспользуйся NSLog, чтобы вывести нужные переменные в консоль...

Добавлено через 1 минуту
Или дай более полный листинг кода... что дальше твориться после вызова метода initDataBase....
1
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
29.05.2013, 18:39  [ТС]
Pro2005,

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
@implementation DataController
 
@synthesize answers = _answers;
 
-(void) initDataBase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbFileName = @"FOOTBALL.sqlite3";
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:dbFileName];
    
    dataBaseFullPath = databasePath;
    // Check to see if the database file already exists
    bool databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
    
    databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];
    if (!databaseAlreadyExists)
    {
        NSArray *pathsDB = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
        NSString* documentsDir = [pathsDB objectAtIndex:0];
        
        NSString *storePath = [documentsDir stringByAppendingPathComponent:dbFileName];
        
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        if (![fileManager fileExistsAtPath:storePath])
        {
            
            NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"FOOTBALL" ofType:@"sqlite3"];
            if (defaultStorePath) {
                [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
            }
        }
    }
    
}
 
-(NSMutableArray*) getQuestion
{
    NSMutableArray *questionsArray = nil;
    sqlite3_stmt* question;
    char *error = NULL;
    NSString* questionGet;
    DataController *dataController = [[DataController alloc] init];
    [dataController initDataBase];
    
    if (sqlite3_open([dataBaseFullPath 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;
}
 
-(NSMutableArray*) getAnswer: (int) number
{
    NSString* ans;
    if(number == 1)
    {
        ans = [NSString stringWithFormat:@"A"];
    }
    else if(number == 2)
    {
        ans = [NSString stringWithFormat:@"B"];
    }
    else if(number == 3)
    {
        ans = [NSString stringWithFormat:@"C"];
    }
    else if(number == 4)
    {
        ans = [NSString stringWithFormat:@"D"];
    }
    sqlite3_stmt* answer;
    char *error;
    NSString* answerGet;
    NSMutableArray* answerArray;
    answerGet = [NSString stringWithFormat:@"SELECT answer %@ FROM QuestionsAndAnswers", ans];
    if(sqlite3_prepare_v2(_myBase, [answerGet UTF8String], -1, &answer, NULL) == SQLITE_OK)
    {
        while(sqlite3_step(answer) == SQLITE_ROW)
        {
            [answerArray addObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(answer, number)]];
        }
    }
    else
    {
        NSLog(@"Error: %s", error);
        NSLog(@"SOL: %s", [answerGet UTF8String]);
    }
    return answerArray;
}
 
@end
Добавлено через 1 час 14 минут
Pro2005, все, уже открыл, получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.05.2013, 18:39
Помогаю со студенческими работами здесь

Открыть базу данных с паролем
Dim DS As String = Application.StartupPath & "MyBase\BD.accdb" Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;...

Не удается открыть базу данных
Доброго времени суток. Начал изучать С# ado.net по книжке. вобщем создал базу данных в SQL Server 2014. Хочу открыть базу через C#. ...

Чем открыть базу данных?
Приветствую! Заранее извиняюсь, если вдруг не в ту тему пишу Дело в следующем: Собираюсь перевести игру, но вот файл в котором...

Открыть базу данных в pycharm
Добрый день, подскажите пожалуйста, как открыть базу данных джанго проекта через pycharm. когда добавляю базу в pycharm она отображается ,...

Не удалось открыть базу данных
Не удалось открыть базу данных "D:\123456\WEBSITES\WEBSITE2\APP_DATA\ASPNETDB.MDF", поскольку она имеет версию 661. Данный сервер...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru