ОШИБКА FMDB 1: такой таблицы нет

Я столкнулся со странной проблемой. Я только что добавил тестовую базу данных в свой проект iPhone под названием "pharmacies.sqlite3". Я скопировал этот файл в папку SUPPORTING FILES в моем проекте iPhone.

Но даже при том, что я скопировал свой пользовательский файл базы данных в папку документов на iPhone, я получил сообщение, что таблица, которую я ищу, не существует. Даже если это доступно. Я немного изменил код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

// FMDB

self.databaseName = [[NSString alloc] initWithString:@"pharmacies.sqlite3"];
NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
self.databasePath = [documentsDir stringByAppendingPathComponent:self.databaseName];

[self createAndCheckDatabase];
[self getPharmacies];


}

И вот мои вспомогательные методы:

- (void)createAndCheckDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:self.databasePath];

if (success) {
    return;
}

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

- (void)getPharmacies
{
FMDatabase *db = [FMDatabase databaseWithPath:self.databasePath];

[db setLogsErrors:YES];
[db setTraceExecution:YES];

[db open];

FMResultSet *results = [db executeQuery:@"SELECT * FROM pharmacies"];

while ([results next]) {
    NSString *name = [results stringForColumn:@"name"];
    NSLog(@"Apotheke: %@", name);
}
[db close];
}

Но до сих пор нет таблицы... я что-то пропустил? нет сообщения об ошибке, что копирование не сработало бы....

4 ответа

У меня была та же проблема, и оказалось, что проблема была в том, что база данных sqlite не появилась в списке ресурсов ресурсов копирования (в разделе выберите проект, затем нажмите "Фазы сборки"), поэтому она не была упакована с остальными ресурсами. Я использую XCode 6.

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

Попробуйте добавить косую черту перед именем файла, например, так:

NSString *finalDatabasePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory,@"/pharmacies.sqlite3"];

Это исправило похожую проблему, с которой я столкнулся.

Я просто попробовал, изменив код на:

NSString *finalDatabasePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory,@"pharmacies.sqlite3"];

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

Теперь сообщение об ошибке исчезает, но появляется новое: "ОШИБКА БД 1: нет такой таблицы: аптеки"

Интересная проблема: таблица определенно есть... но, согласно другим источникам, это означает, что FMDB создал новую БД с названием аптеки, но без каких-либо таблиц. Это происходит в соответствии с руководством, когда нет такой таблицы с таким именем. Итак... я сделал эту копию базы данных, как вы можете видеть выше... но в папке doc, похоже, вообще нет базы данных...?

Я боролся с этой проблемой в течение нескольких часов.. частично из-за того факта, что я не понимаю, как работают пути в среде Mac (исходя из фона MS/Visual Studio)..

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

Оказалось, что это.. /Users/myname/Desktop/delete_later/Xcode Projects/CustomerDB/CustomerDBTests/supplier.sqlite

Я жестко прописал в своем коде следующее:

NSString *writableDBPath = @"/Users/myname/Desktop/delete_later/Xcode Projects/CustomerDB/CustomerDBTests/supplier.sqlite";

db = [FMDatabase databaseWithPath:writableDBPath];
 [db open];

Это решило проблему для меня сразу....

Другие вопросы по тегам