Невозможно вставить в базу данных SQLITE с оболочкой FMDB

Я новичок в разработке IOS, поэтому я слежу за этим

руководство

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

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

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))

Что мне не хватает?


person user2158797    schedule 11.03.2013    source источник
comment
Попробуйте www.github.com/pmurphyjam/DBExample. Это проект Xcode, использующий Sqlite. Синтаксис SQL такой же, как у FMDB. Он также может выполнять большие транзакции SQL.   -  person Pat    schedule 23.05.2014


Ответы (2)


Вы пропустили шаг в руководстве:

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

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

person Richard Brown    schedule 11.03.2013
comment
Спасибо, это правда. Мне удалось вызвать функцию перед записью в БД, которая проверяет, скопировался ли БД в папку с документами, в противном случае копирует сразу, используя метод copyItemAtPath, который вы только что описали. И это работает! Теперь мне интересно, если это постоянно, я имею в виду, нужно ли мне выполнять дополнительные действия, чтобы изменения сохранялись на устройстве? Я обнаружил, что если я повторно запускаю симулятор - после запуска приложения один раз, вставки в базу данных и закрытия симулятора - приложение запускается со свежей копией базы данных. - person user2158797; 12.03.2013
comment
Вам нужно сделать этот шаг только в том случае, если файл не существует. Поэтому оберните приведенное выше вызовом для проверки файла перед его повторным копированием. - person Richard Brown; 12.03.2013
comment
Спасибо, Ричард, я только что сделал это, и все работает нормально. Однако у меня есть еще один вопрос, и я готов: нужно ли мне что-то еще, чтобы сделать изменения (вставки в таблицу) постоянными? Я имею в виду, что я запускаю приложение в симуляторе, я могу вставлять в таблицу столько раз, сколько хочу, я проверяю, правильно ли вставлены элементы. Все кажется в порядке. Но затем я останавливаю выполнение (с помощью кнопки XCode STOP) и повторно запускаю/перестраиваю приложение, которое открывается в том же симуляторе, что и раньше, но теперь с пустой копией базы данных. Почему я не вижу вставки, которые я сделал при первом запуске? - person user2158797; 12.03.2013

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

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

person paulmelnikow    schedule 11.03.2013