我正在做一个非常经典的例程,我已经多次完成,但在这个项目中,它不起作用。当我想使用我的数据库时,我得到“没有这样的表”错误。哪个应该是错的。我检查了捆绑数据库及其罚款;我检查了手机中的“结果”数据库,并且它完全没空(没有结构,显然没有数据)。
这是我的数据库创建例程。我每次需要数据库时都会调用它。
+ (FMDatabase*)createAndCheckDataBase{
BOOL success;
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"database.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
//The database already exist in the application folder, we don't need to create it
if(success){
return [FMDatabase databaseWithPath:databasePath];
}
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.sqlite"];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
return [FMDatabase databaseWithPath:databasePath];
然后我只做FMDatabase *db = [DatabaseManager createAndCheckDatabase];
而我应该得到我的数据库。但我没有。
我使用Firefox的SQLite Manager插件创建了sqlite数据库,在那里创建了结构,然后将其导入到包中。
注意:成功总是返回true。
欢迎任何帮助!
答案 0 :(得分:2)
正如提到的评论,您需要检查副本。
这是我的代码片段,用于检查副本是否成功并将错误详细信息返回给消费者
//
// notice our method to prepare the db returns bool and doesn't lose the error details
// the consumer can log, present, whatever - this is a library function
//
- (BOOL)ensureDatabasePrepared: (NSError **)error
{
// <snip bunch of code>
// copy db from template to library
if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
{
NSLog(@"db not exists");
// notice how we pass in the error ref passed to this function
if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:error])
{
return NO;
}
NSLog(@"copied");
}