使用FMDB连接到捆绑数据库

时间:2018-03-29 10:44:36

标签: ios objective-c xcode sqlite fmdb

我通过

在我的捆绑包中添加了SQLite数据库
  • 拖放到XCode
  • 创建论坛
  • 添加到目标(PROJECTNAME)

然后我尝试访问数据库

NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mbtiles"];
NSLog(@"%@", path);
  

/用户/.../库/开发商/ CoreSimulator /设备/ 4AB0090D-6035-4C78-90F3-CD6B70D81F05 /数据/容器/捆绑/应用/ 721198C0-FFD8-42B1-9C79-78DBC54AB644 / maps.app / test.mbtiles

FMDatabase *db = [FMDatabase databaseWithPath:path];
[db open];
FMResultSet *rs = [db executeQuery:@"SELECT * FROM maps"];

到目前为止,一切似乎都很好。至少我没有收到任何错误/警告。

NSLog(@"%@", rs); 
  

FMResultSet:0x604000a5f380

NSDictionary *dict = [rs resultDictionary];
NSLog(@"%@", dict);
  

警告:此集中似乎没有列。

NSData *tile = [databaseResult dataForColumn:@"tile_data"];
  

(空)

为什么?是否无法访问捆绑的资源中保存的数据库?

我尝试使用此code

检查数据库的存在
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appDBPath = [documentsDirectory stringByAppendingPathComponent:@"test.mbtiles"];
success = [fileManager fileExistsAtPath:appDBPath];
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.mbtiles"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:appDBPath error:&error];
  

打开/Users/.../Library/Developer/CoreSimulator/Devices/4AB0090D-6035-4C78-90F3-CD6B70D81F05/data/Containers/Data/Application/EB9390A7-2210-4C8A-A94A-016C03FA1296/Documents/ test.mbtiles:文件存在

那告诉我如果我没弄错的话database就在那里?! 但是,当我尝试像

这样的东西时
NSAssert(success, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
  

***断言失败 - [DatabaseAccess loadTileAtPath:result:],/ Users /.../ DatabaseAccess.m:78

我在这里有点失落。为什么我不能查询我的database

1 个答案:

答案 0 :(得分:0)

即使只有一个行的结果,也需要next语句。

FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
    //retrieve values for each record
}

在尝试访问查询中返回的值之前,您必须始终调用-[FMResultSet next],即使您只期望一个:

FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
    int totalCount = [s intForColumnIndex:0];
}

来源:https://github.com/ccgus/fmdb#executing-queries