2013-03-11 4 views
0

Я новичок в разработке IOS, поэтому я после этойне удается вставить в базу данных SQLite с FMDB обертке

tutorial

Как уже упоминалось в этой статье я сделал свою базу данных с помощью команды SQLITE строки, созданные мои таблицы и затем импортировал базу данных в моем проекте XCode 4.6, добавив ее в папку «Поддерживаемые файлы».

Я просто хочу, чтобы заполнить таблицу с данными, поэтому у меня есть функция, которая первая находит свою базу данных и копирует его в папку Documents (если нет, уже):

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Customers.db"]; 
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath]; 

Это прекрасно работает как writebleDBPath указывает на реальный путь, где лежит Customers.db (в папке Документы проекта)

Теперь я открыть базу данных и попытаться добавить новую запись:

[db open]; 
BOOL success = [db executeUpdate:@"INSERT INTO customers (firstname,lastname) VALUES (?,?);",[patient.firstName UTF8String],[patient.secondName UTF8String], nil]; 

[db close]; 

, но значение успеха всегда «НЕТ».

Я включил код, используемый для создания базы данных SQLite:

CREATE TABLE customers(id integer primary key, firstname varchar(30), lastname varchar(30)) 

Что я упускаю?

+0

Попробуйте www.github.com/pmurphyjam/DBExample Это проект Xcode, который использует Sqlite. Синтаксис SQL такой же, как и FMDB. Он также может выполнять большие транзакции SQL. – Pat

ответ

0

Вы оставили из шаг в учебнике:

NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName]; 
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 

Какие копии файла базы данных из комплекта. Предполагается, что вы создали базу данных и ее схему и включили ее в пакет с приложением.

+0

Спасибо, это правда. Мне удалось вызвать функцию перед записью в базу данных, которая проверяет, скопирована ли база данных в папку документов, иначе она скопирует ее сразу, используя метод copyItemAtPath, который вы только что описали. И это работает! Теперь, интересно, постоянно ли это, я имею в виду, нужно ли выполнять дополнительные действия, чтобы изменения были постоянными на устройстве? Я узнал, что если я повторно запускаю симулятор - после запуска приложения один раз и вставки в базу данных и закрытия симулятора - приложение запускается со свежей копией базы данных – user2158797

+0

Вам нужно всего лишь сделать этот шаг, если файл не работает, t существует. Таким образом, оберните это в вызове, чтобы проверить файл, прежде чем копировать его снова. –

+0

Спасибо, Ричард, я только что сделал это, и он работает нормально. Однако у меня есть еще один вопрос, и я закончил: мне нужно что-то еще, чтобы изменения (вставки в таблицу) были постоянными? Я имею в виду, я запускаю приложение в симуляторе, я могу вставить столько раз, сколько хочу в таблицу, я проверю, что элементы вставлены правильно. Все кажется прекрасным. Но затем я останавливаю запуск (с кнопки XCode STOP) и повторно запускаю/перестраиваю приложение, которое открывается в том же симуляторе, что и раньше, но теперь с пустой копией базы данных. Почему я не вижу вставки, которые я сделал в первом запуске? – user2158797

1

Если id является основным ключом, возможно, вам тоже нужно установить его.

Попробуйте ввести [db lastErrorMessage], чтобы узнать, в чем проблема.

Смежные вопросы