我通过
在我的捆绑包中添加了SQLite
数据库
然后我尝试访问数据库
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
?
答案 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];
}