iphone FMDB не может найти таблицу

- init
{
    if(![super init]) return nil;

    //the database is stored in the application bundle.
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingFormat:@"/base.sqlite"];
    NSLog(@"%@",path);
    db = [FMDatabase databaseWithPath:path];
    [db setLogsErrors:YES];

    if (![db open]) { 
        NSLog(@"Could not open db."); 
        return 0; 
    } else { 
        NSLog(@"DB Open...."); 
    } 

    FMResultSet *rs = [db executeQuery:@"SELECT * FROM settings"]; 

    return self; 
}

это код, который я использую для доступа к данным из настроек. но это дает ошибку (и я могу вас заверить, что есть таблица настроек!)

вот дамп с терминала

BEGIN TRANSACTION;
CREATE TABLE About (id integer PRIMARY KEY AUTOINCREMENT,key varchar UNIQUE,value text);
DELETE FROM sqlite_sequence;
CREATE TABLE settings (version integer,updated timestamp,owner varchar);
INSERT INTO "settings" VALUES(1,'2009-05-11 14:29:07','boulevart');
COMMIT;

и ошибка:

2009-05-11 16:14:19.799 SummerGuide[9892:20b] /Users/andyjacobs/Library/Application Support/iPhone Simulator/User/Applications/762630F5-78CB-41A4-85C2-964316ACFE1D/Documents/base.sqlite
2009-05-11 16:14:19.801 SummerGuide[9892:20b] DB Open....
2009-05-11 16:14:19.804 SummerGuide[9892:20b] DB Error: 1 "no such table: settings"
2009-05-11 16:14:19.804 SummerGuide[9892:20b] DB Query: SELECT * FROM settings

странно то, что если я изменю свой путь, например, на /baseeeeeee.sqlite (который не является файлом), он все еще говорит «БД открыта ....».

Я просто добавил существующий файл sqlite (base.sqlite) в свою папку ресурсов и добавил библиотеку sqlite3 в свои фреймворки.


person Andy Jacobs    schedule 11.05.2009    source источник


Ответы (1)


Чтобы получить путь к вашему файлу в комплекте приложений, используйте это:

[[NSBundle mainBundle] pathForResource:@"base" ofType:@"sqlite"];

Чтобы открыть базу данных, вам, возможно, придется сначала скопировать ее в каталог «Документы», потому что попытка изменить файл в вашем пакете приложений — плохая новость.

person Chris Lundie    schedule 11.05.2009
comment
Вам нужно скопировать его в каталог документов, если вы хотите вставить или обновить некоторые записи? - person Andy Jacobs; 11.05.2009
comment
да. Причина в том, что сигнатура кода вашего приложения связана с безопасным хэшем всего в пакете приложения. Если вы измените что-то в комплекте, вы сделаете эту подпись кода недействительной; это (я полагаю, не попробовав это явно) приведет к тому, что ваше приложение не запустится, поскольку подпись кода теперь будет недействительной. - person Jim Dovey; 11.05.2009