2012-08-28 175 views
1

我有一段代码添加一个数据库,如果它还没有被创建。 下面是代码数据库未被创建

-(void) checkAndCreateDatabase{ 
    // Check if the SQL database has already been saved to the users phone, if not then copy it over 

    NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    NSString *database_path=[path stringByAppendingPathComponent:@"Favorite_Database.sqlite"]; 

    // Create a FileManager object, we will use this to check the status 
    // of the database and to copy it over if required 

    // Check if the database has already been created in the users filesystem 
    BOOL success = [[NSFileManager defaultManager] fileExistsAtPath:database_path]; 

    // If the database already exists then return without doing anything 
    if(success) { 
     //[fileManager removeFileAtPath:databasePath handler:nil]; 
     return; 
    } 
    // If not then proceed to copy the database from the application to the users filesystem 

    // Get the path to the database in the application package 
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Favorite_Database.sqlite"]; 

    // Copy the database from the package to the users filesystem 
    [[NSFileManager defaultManager] copyItemAtPath:databasePathFromApp toPath:database_path error:nil]; 

} 

当它击中线BOOL success = [[NSFileManager defaultManager] fileExistsAtPath:database_path];它只是跳过,其余并继续上。我没有得到if语句。我需要它来检查,所以我可以添加这个数据库

我怎样才能让它正常工作?

回答

0

注销路径,所以如果您正在模拟器中运行,您可以通过在终端中转到该路径来查看该文件是否实际存在。您也可以使用sqlite cmdline来检查数据库文件。

这是来自我的样本的代码,它执行类似的任务。

它(1)检查数据库是否存在,如果不存在,(2)它从包中复制它并(3)打开它。

希望它可以帮助...

- (BOOL)ensureDatabaseOpen: (NSError **)error 
{ 
    // already created db connection 
    if (_contactDb != nil) 
    { 
     return YES; 
    } 

    NSLog(@">> ContactManager::ensureDatabaseOpen");  
    if (![self ensureDatabasePrepared:error]) 
    { 
     return NO; 
    } 

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK && 
     error != nil) 
    { 
     *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease]; 
     return NO; 
    } 

    NSLog(@"opened"); 

    return YES; 
} 

- (BOOL)ensureDatabasePrepared: (NSError **)error 
{ 
    // already prepared 
    if ((_dbPath != nil) && 
     ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath])) 
    { 
     return YES; 
    } 

    // db in main bundle - cant edit. copy to library if !exist 
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"]; 
    NSLog(@"%@", dbTemplatePath); 

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"]; 

    NSLog(@"dbPath: %@", _dbPath); 

    // copy db from template to library 
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath]) 
    { 
     NSLog(@"db not exists"); 
     NSError *error = nil; 
     if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error]) 
     { 
      return NO; 
     } 

     NSLog(@"copied"); 
    }  

    return YES;  
} 
+0

在我的代码和代码都停靠在'如果(fileExistsAtPath)'然后就跳过其余没有任何错误 – BigT

+0

嗯 - 你可以尝试加入一些记录和运行在模拟器和设备上? (试图排除文件系统/权限等...在虚拟器中) – bryanmac

+0

也 - 当您在模拟器中运行时,请确保您可以注销并访问该终端中的路径。 – bryanmac