FMDB错误1:没有这样的表

时间:2012-06-10 20:30:53

标签: iphone fmdb

我遇到了一个奇怪的问题。我刚刚在我的iPhone项目中添加了一个名为“pharmacies.sqlite3”的测试数据库。我已将该文件复制到iPhone项目的SUPPORTING FILES文件夹中。

但即使我将我的自定义db文件复制到iPhone上的documents文件夹中,我收到一条消息,我正在查找的表不存在。即使它可用。我稍微重构了一下我的代码:

- (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 个答案:

答案 0 :(得分:2)

我有同样的问题,事实证明问题是sqlite数据库没有出现在Copy Bundle Resources列表中(在选择项目下然后点击Build Phases),所以它没有和其他的一起打包资源。我正在使用XCode 6。

我认为发生的事情是fmdb open函数创建一个空数据库。当你查询它时会抱怨你的表丢失了,因为你自己的数据库从未被复制过。

答案 1 :(得分:1)

尝试在文件名前添加正斜杠,如下所示:

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

这解决了我遇到的类似问题。

答案 2 :(得分:0)

我只是尝试将代码更改为:

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

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

现在错误消息消失了,但是出现了一个新消息: “DB ERROR 1:没有这样的表:药店”

有趣的问题:该表肯定存在......但根据其他来源,这意味着FMDB创建了一个名为pharmacies的新数据库,但没有任何表。当没有带有该名称的表时,根据手册会发生这种情况。所以...我已经制作了这个数据库副本,如上所示......但是在doc文件夹中似乎根本没有数据库......?

答案 3 :(得分:0)

我在这个问题上挣扎了好几个小时......部分是因为我无法理解路径在mac环境中是如何工作的(来自MS / Visual studio背景)..

搜索结果上的大量示例代码也不起作用..至少在我的情况下......所以我解决它的方法是仔细查看顶部SQLiteManager标题路径上的数据库文件路径.. < / p>

原来是...... / 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];

这马上解决了我的问题......