我遇到了一个奇怪的问题。我刚刚在我的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];
}
但是仍然没有找到任何桌子..我错过了什么吗?没有错误信息表明复制不起作用....
答案 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];
这马上解决了我的问题......