Не удается открыть / создать базу данных SQLite в iOS

ve 2 файла DatabaseViewController.h файл, который имеет

#import 
#import "sqlite3.h"

@interface DatabaseViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *status;
@property(strong,nonatomic) NSString *databasePath;
@property(nonatomic) sqlite3 *contactDb;

@end

Другой DatabaseViewController.m:

- (void)viewDidLoad
{

[super viewDidLoad];
NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];

//Buid the path for database file
_databasePath = [[NSString alloc]
                 initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if([filemgr fileExistsAtPath: _databasePath ] == NO)
{
    const char *db_path = [_databasePath UTF8String];

    if(sqlite3_open(db_path, &_contactDb) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt =
        "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)";

        if (sqlite3_exec(_contactDb, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            _status.text = @"Failed to create table";
        }
        sqlite3_close(_contactDb);
    } else {

        _status.text = @"Failed to open/create database";
    }
}


}

К сожалению, заявление

if(sqlite3_open(db_path, &_contactDb) == SQLITE_OK)

никогда не удается

Это просто маршруты в

 _status.text = @"Failed to open/create database";

В чем проблема?

Я добавил libsqlite3.dylib в проект. Я использую Xcode 4.5.

Ответы на вопрос(2)

Решение Вопроса

NSDocumentationDirectory должно быть .NSDocumentDirectory

 Dixit Gokhale25 окт. 2012 г., 09:03
Спасибо много Роб .. Это работает сейчас ..

не берите в голову - забывая, что sqlite_open также создаст файл базы данных, если он не 'не существует, проблема была просто неправильная ссылка на каталог.

 Rob19 окт. 2012 г., 18:06
В пункте 2 я сделал вывод, что целью этого кода было создание базы данных и создание таблицы в базе данных, только если база данных нет уже существует. В принципе,viewDidLoad просто гарантирует, что база данных готова к использованию, а не пытается открыть базу данных для будущих операций. Диксит просто создает его, если нене существует. Если это действительно было целью, то я думаю, чтоif утверждение верно.
 rmaddy19 окт. 2012 г., 18:10
@Rob Как написано, код говорит:если файл базы данных не существует, откройте файл базы данных ", Это неправильно, несмотря ни на что. В размещенном коде нет ничего, что правильно решает проблему с файлом, который еще не существует, и, скорее всего, является настоящей проблемой. Вы можете't создать файл базы данных, вызвав sqlite3_open для несуществующего файла.
 Rob19 окт. 2012 г., 18:26
Согласовано. Я желаю, чтобы онибуду осуждатьsqlite3_open, как это'Постоянно вызывает путаницу (как правило, встречная проблема, когда кто-то пытается открыть базу данных, неправильно вводит имя файла или не может скопировать из пакета вDocumentsи пусть он создаст новый пустой без выдачи ошибки).
 rmaddy19 окт. 2012 г., 18:22
@ Роб Моя ошибка. Я думал оsqlite3_open_v2 метод, когда я сделал это заявление. я забыл об этомsqlite_open создаст файл по умолчанию. Я'уточню мой ответ. Основываясь на этом, проблема была просто неправильная ссылка на каталог. Благодарю.
 Rob19 окт. 2012 г., 18:13
Если вы хотите создать базу данных, вы используетеsqlite3_open, Эта функция создает базу данных, если она непо умолчанию. Только если вы используетеsqlite3_open_v2 и явно опуститьSQLITE_OPEN_CREATE попытка открытия несуществующей базы данных не создаст ее для вас (или если вы попытаетесь открыть базу данных в каталоге, который вы не указали)не имеет разрешения на запись, например вне песочницы). Ноsqlite3_open создаст его, если у вас есть права на запись в местоположение, которое выпытаемся открыть базу данных.

Ваш ответ на вопрос