Определить, содержит ли таблица столбец в Android / sqlite - PullRequest
4 голосов
/ 20 апреля 2010

Итак, у меня есть приложение на рынке, и с обновлением я хочу добавить несколько столбцов в базу данных. Пока проблем нет. Но я хочу определить, отсутствуют ли в используемой базе данных эти столбцы, и добавить их, если это так. Мне нужно, чтобы это делалось динамически, а не только после обновления до новой версии, поскольку предполагается, что приложение все еще сможет импортировать более старые базы данных. Обычно я мог бы использовать запрос PRAGMA , но я не уверен, как это сделать с Android. Я не могу использовать execSQL, так как это запрос, и я не могу понять, как использовать PRAGMA с функцией query ().

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

Приветствия

Ответы [ 4 ]

12 голосов
/ 20 апреля 2010

Прагма работает. В качестве примера я только что попробовал это на одной из моих баз данных Android-приложений.

sqlite> pragma table_info (userCommand);

cid name        type    notnull     dflt_value  pk
0   id      INTEGER     0       1
1   description TEXT    0       0
2   message     TEXT    0       0

Как мы видим, в указанной таблице три поля. идентификатор, описание и сообщение.

Так что в вашем приложении используйте что-то вроде:

Cursor c = null;
c = RawQuery ("pragma table_info (userCommand)",null); 
// if c has records and is not null then iterate through the records in search of your table name. 

Прошу прощения за плохое форматирование.

3 голосов
/ 20 апреля 2010

Это может быть излишним, но вы можете выбрать одну строку из вашей таблицы в Cursor и использовать Cursor.getColumnIndex ([имя столбца как строка]). Это вернет -1, если он не существует.

3 голосов
/ 20 апреля 2010

Попробуйте использовать PRAGMA с rawQuery() вместо query().

0 голосов
/ 20 апреля 2010

Вы можете выполнить следующую команду, просмотреть результаты и посмотреть, указан ли ваш столбец.

pragma table_info(table_name);

Редактировать: Я никогда не делал этого на Android, но я думаю, что это должно работать

...