2009-11-04 6 views
0

У меня есть SQLite db с 19 записями в нем. Из этих записей 18 имеет значение «угроза», равное 1, а одно из них имеет «угроза», равное 2. Поле установлено по умолчанию 1. Я недавно изменил 19-ю запись на «угроза» 2 для целей тестирования. Я использовал SQLite Manager (расширение Firefox), чтобы добавить значение непосредственно в файл sqlite в моем проекте. Я могу запросить таблицу, и это показывает, что в 19-й записи есть «угроза», равная 2. Когда я запускаю свое приложение в симуляторе, в 19-й записи есть «угроза» из 1. Я пробовал очистить мою сборку, приложение из симулятора, даже удаляя базу данных sqlite из моего проекта и считывая ее. Ничего не работает. SQLite Manager говорит, что это имеет значение 2, но при запуске программы она получает значение 1. Код для загрузки его в класс из БД заключается в следующем:Запись SQLite не верна на симуляторе iPhone

primaryKey = pk; 
    database = db; 

    // Compile the query for retrieving City data. 
    if (init_statement == nil){ 
     const char *sql = "SELECT * FROM myTable WHERE id=?"; 
     if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK){ 
      NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database)); 
     } 
    } 

    sqlite3_bind_int(init_statement, 1, primaryKey); 
    if (sqlite3_step(init_statement) == SQLITE_ROW){ 
       LOAD THE FIRST 12 FIELDS HERE 
     self.threat_level = sqlite3_column_int(init_statement, 13); 
    } else { 
     self.name = @"Nothing"; 
    } 

EDIT I просто попытался удалить базу данных sqlite из проекта, и я переместил ее на свой рабочий стол, чтобы поддержать ее. Я все еще могу создать и запустить приложение. Итак, он смотрит на более старую версию моей базы данных, но Spotlight говорит, что на моей машине нет других версий, кроме той, что есть на моем рабочем столе. Любая помощь здесь?

+0

Почему бы не использовать основные данные? – bbum

+0

Зачем использовать Core Data? (Основные данные не во всех версиях Framework) –

+0

@Pselus Действительно ли вы ориентируетесь на устройства 2.x? –

ответ

0

Должно быть довольно легко определить имя/путь к базе данных, которую вы используете, поскольку вам необходимо предоставить аргумент как часть sqlite3_open()?

if (sqlite3_open([dataFilePath UTF8String], &database) == SQLITE_OK) { 

Файл базы данных, вероятно, находится в симуляторе. В симуляторе есть опция «Сбросить содержимое и настройки».

+0

Сброс содержимого и настроек исправил проблему. Благодаря! –

0

Я думаю, что вместо того, чтобы использовать SELECT * Вы можете использовать явные имена столбцов в строке выбора ...

+0

Почему все остальные поля работают правильно? –

+0

в целом лучше использовать имена столбцов, чем '*', потому что, если порядок столбцов в таблице изменится, он сломает код. –

1

Вы можете использовать lsof в список открытых файлов с помощью процесса, который может помочь вам с надеждой прибить какая база данных используется. Найдите идентификатор процесса вашего приложения с Монитором активности или т. П. И запустите lsof -p <PID> в терминале.

0

Где находится ваш sqlite в вашем проекте - например. Это в вашем приложении или вы пишете его в папке «Документы» для вашего приложения?

Если вы пишете его в папку Документы для вашего приложения и запустить симулятор ваш файл будет находиться в папке поддержки приложений для iPhone Simulator

~/Library/Application Support/iPhone Simulator/User/Applications/<application id> 

Также я добавлю +1 к используя Core Data в целом - я просто присутствовал на мероприятии Apple iPhone, и есть некоторые существенные преимущества по эффективности и производительности, которые можно получить благодаря использованию Core Data на большинстве других инфраструктур sqlite и, особенно, непосредственно на доступе к sqlite c api.

Смежные вопросы