SQLite с использованием FMDB: вставка записи не работает / нет такой таблицы - PullRequest
2 голосов
/ 14 декабря 2011

Пожалуйста, помогите мне определить проблему.

Оператор вставки не работает, он выдает мне сообщение об ошибке «Нет такой таблицы ...», когда я проверял базу данных sqlite, сохраненную в / Users / jppangilinan / Библиотека / Поддержка приложений /iPhone Simulator / 4.3 / Applications / 61BBA03F-C240-414D-9A64-6CE3B34DF9C2 / Documents / person.sqlite3 похоже, что при сохранении базы данных в этом месте нет таблиц, поэтому оператор вставки не работает.Почему он не скопировал мою базу данных sqlite в мою папку ресурсов в моем проекте?TIA

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsPath = [paths objectAtIndex:0];
    NSString *path = [docsPath stringByAppendingPathComponent:@"person.sqlite3"];

FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];

[database beginTransaction];

NSString *query = [NSString stringWithFormat:@"insert into person(rowid,fname,lname,address) values (null, '%@','%@','%@')",fname.text,lname.text,address.text];

NSLog(@" %@",path);
NSLog(@" %@",query);

BOOL y= [database executeUpdate:query];

if (!y)
{
    NSLog(@"insert failed!!");
}

NSLog(@"Error %d: %@", [database lastErrorCode], [database lastErrorMessage]);



[database commit];
[database close];

}

Ответы [ 5 ]

3 голосов
/ 15 декабря 2011

Чтобы получить доступ к базе данных ресурсов в папке «Документы» приложения, сначала необходимо скопировать ее туда при запуске приложения.

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

Для этого вы можете использовать:

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSError *error;

NSString *databasePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"person.sqlite3"];

[[NSFileManager defaultManager] copyItemAtPath:databasePath 
                                                toPath:[NSString stringWithFormat:@"%@/%@",documentsDirectory,@"person.sqlite3"]
                                                 error:&error];

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

То, что происходило, состояло в том, что, поскольку существующий файл БД не был скопирован, при вызове databaseWithPath создается новый пустой файл, поэтому вы получаете ошибку Error 1: no such table: person.

Из Документация FMDB :

Создание базы данных

База данных FMD создается с путем к файлу базы данных SQLite. это Путь может быть одним из этих трех:

Путь к файловой системе. Файл не должен существовать на диске. Если оно не существует, он создан для вас. Пустая строка (@ ""). Пустая база данных создается во временном местоположении. Эта база данных удалена с подключением базы данных FMD закрыты.

NULL. База данных в памяти создана. Эта база данных будет уничтожено с помощью базы данных FMD, соединение закрыто.

FMDatabase * db = [FMDatabase databaseWithPath: @ "/ tmp / tmp.db"];

1 голос
/ 14 декабря 2011

Некоторые вещи, на которые стоит обратить внимание:

  • Посмотрите на использование параметров (? В sqlite вместо stringWithFormat)
  • Вам необходимо проверить коды ошибок: большинство из этих функций возвращают bool.В базе данных также есть lastErrorCode (int), lastErrorMessage (NSString) и hadError (bool).Проверьте и зарегистрируйте их.
  • для uniqueId, вы вставляете const 11. Не кажется уникальным.Если идентификатор с автоматическим заполнением, проверьте lastInsertedRowId и не указывайте идентификатор в операторе вставки.http://www.sqlite.org/autoinc.html

https://github.com/ccgus/fmdb/blob/master/src/FMDatabase.h

образец: https://github.com/ccgus/fmdb/blob/master/src/fmdb.m

0 голосов
/ 05 ноября 2014

У меня возникли те же проблемы. Я решил эту проблему с помощью приведенного ниже кода, добавьте этот код и сохраните путь к базе данных в _dbPath:

- (void) FMDBInitializer{
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentDir stringByAppendingPathComponent:DATABASENAME];

NSLog(@"%@",databasePath);

BOOL success;

NSFileManager *fileManager = [NSFileManager defaultManager];

success = [fileManager fileExistsAtPath:databasePath];

self._dbPath = databasePath;

if(!success){
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DATABASENAME];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    //self._db = [FMDatabase databaseWithPath:databasePath];
}
else {
    //self._db = [FMDatabase databaseWithPath:databasePath];
}

}

И добавьте эту единственную строку кодав каждом вашем запросе:

FMDatabase *database = [FMDatabase databaseWithPath:self._dbPath];
0 голосов
/ 30 декабря 2011

Копия в вашей папке '/ Users / jppangilinan / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Applications / 61BBA03F-C240-414D-9A64-6CE3B34DF9C2 / Documents / person.sqlite3', вероятно, не совпадает с той, что имеется вместо, откуда вы загрузили базу данных.Щелкните правой кнопкой мыши по вашей базе данных в Xcode и посмотрите информацию о получении.Если эта база данных является той, которую вы ожидаете прочитать из exode (хорошая), скопируйте ее для замены в '/ Users / jppangilinan / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Applications /.../ Documents /person.sqlite3.Я столкнулся с подобной проблемой.

0 голосов
/ 14 декабря 2011

Попробуйте, начните транзакцию и подтвердите:

FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];

[database beginTransaction];

NSString *query = [NSString stringWithFormat:@"insert into person(uniqueId,fname) values (%d, '%@')",11,@"Paul"];

NSLog(@" %@",path);

BOOL y= [database executeUpdate:query];

if (!y)
{
    NSLog(@"insert failed!!");
}

[database commit];
[database close];

после выполнения этой части кода откройте файл sqlite, который находится в пути печати в 'nslog' путь будет таким: / Пользователи / ** / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Приложения / person.sqlite3

любая помощь вернуться назад

Спасибо

...