2015-07-03 3 views
1

Я пытаюсь создать БД, используя Sqlite3 в приложении iOS. Если я создаю БД в подпапке документа dir, он НЕ создает БД, он не может открыть или создать базу данных. Если я не создаю БД во вложенной папке, вместо этого, если я непосредственно создам ее в каталоге документа. Он создает его правильно.Не удалось создать базу данных sqlite в подпапке каталога документов

Это дает путь, DataBasePath: "/ уаг/мобильный/Контейнеры/Data/Application/986037DB-6FA0-4066-9977-C5D7A075C5E7/Do cuments/MailFolder/INBOX.db" Но это не удается при - >if (sqlite3_open(dbpath, &database) == SQLITE_OK) - Ниже мой код создает БД в подпапке. Может ли кто-то исправить меня, что здесь не так?

- (BOOL) createFolderMailDB :(NSString *) dbName { 
    NSString *docsDir; 
    NSArray *dirPaths; 

    // Get the documents directory 
    dirPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    //docsDir =[[dirPaths objectAtIndex:0] stringByAppendingPathComponent:@"MailFolder"]; 
    NSString *documentsPath = [dirPaths objectAtIndex:0]; 
    docsDir = [documentsPath stringByAppendingPathComponent:@"/MailFolder"]; 

    //docsDir = dirPaths[0]; 
    // Build the path to the database file 
    NSMutableString *finalDBPath = [[NSMutableString alloc]init]; 
    [finalDBPath appendString:dbName]; 
    [finalDBPath appendString:@".db"]; 
    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: finalDBPath]]; 

    NSLog(@"databasePath: %@", databasePath); 

    BOOL isSuccess = YES; 

    NSFileManager *filemgr = [NSFileManager defaultManager]; 
    if ([filemgr fileExistsAtPath: databasePath] == NO) 
    { 
     const char *dbpath = [databasePath UTF8String]; 
     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      char *errMsg; 
      const char *sql_stmt = "create table if not exists MailFolderDBTable (emailid text, foldername text, messagedata text)"; 
      if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) 
       != SQLITE_OK) 
      { 
       isSuccess = NO; 
       NSLog(@"Failed to create table"); 
      } 
      sqlite3_close(database); 
      return isSuccess; 
     } 
     else { 
      isSuccess = NO; 
      NSLog(@"Failed to open/create database"); 
     } 
    } 

    return isSuccess; 
} 
+0

Сначала вам нужно создать подпапку. – rmaddy

+0

BTW - избавиться от «косой черты» при вызове 'stringByAppendingPathComponent'. Весь смысл этого метода состоит в том, чтобы обеспечить, чтобы для вас был добавлен правильный разделитель путей. – rmaddy

+0

Я создаю только подкаталог. Он задает путь как «/var/mobile/Containers/Data/Application/986037DB-6FA0-4066-9977-C5D7A075C5E7/Documents/MailFolder/INBOX.db« Но здесь он не работает-> if (sqlite3_open (dbpath, & database) == SQLITE_OK) – user1953977

ответ

3

Папка, в которой вы размещаете эту базу данных, должна существовать или попытки создать базу данных там не удастся. Поэтому создайте эту папку, прежде чем приступать к созданию базы данных:

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
NSString *databaseFolder = [documentsPath stringByAppendingPathComponent:@"MailFolder"]; 
NSFileManager *filemgr = [NSFileManager defaultManager]; 

if (![filemgr fileExistsAtPath:databaseFolder]) { 
    NSError *error; 
    if (![filemgr createDirectoryAtPath:databaseFolder withIntermediateDirectories:FALSE attributes:nil error:&error]) { 
     NSLog(@"Error creating %@: %@", databaseFolder, error); 
    } 
} 

NSString *databasePath = [[databaseFolder stringByAppendingPathComponent:dbName] stringByAppendingPathExtension:@"db"]; 

if (![filemgr fileExistsAtPath:databasePath]) { 
    // database creation logic 
} 
+1

Решенный, спасибо вам большое! – user1953977