2

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

但即使我将自定义 db 文件复制到 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

4 回答 4

2

我遇到了同样的问题,结果问题是 sqlite 数据库没有出现在 Copy Bundle Resources 列表中(在选择项目下然后单击 Build Phases),因此它没有与其余资源打包在一起。我正在使用 XCode 6。

我认为会发生什么是 fmdb open 函数创建了一个空数据库。当您查询时,它会抱怨您的表丢失了,因为您自己的数据库一开始就没有被复制。

于 2014-10-12T03:06:30.490 回答
1

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

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

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

于 2012-08-16T20:50:12.760 回答
0

我只是通过将代码更改为:

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

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

现在错误消息消失了,但出现了一个新消息:“DB ERROR 1: no such table: pharmacies”

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

于 2012-06-10T21:09:51.253 回答
0

我在这个问题上苦苦挣扎了好几个小时..部分原因是..我不明白路径在 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];

这立即为我解决了问题....

于 2012-10-08T03:51:27.607 回答