Android SQLite вставка уникальная - PullRequest
4 голосов
/ 30 июля 2010

Достаточно простой вопрос, но я не могу найти в нем полустойную документацию. Итак, я создал свою базу данных SQLite, но у нее есть две проблемы или одна в зависимости от того, как вы на это смотрите! БД создает нормально, и я могу показать данные в базовом представлении списка, однако при изменении ориентации телефона / эмулятора операторы вставки запускаются снова и дублируют все записи. Я предполагаю, что это как-то связано со всем кодом, размещаемым в методе OnCreate (). Мой главный вопрос, однако, заключается в том, как сделать INSERT UNIQUE или запросить базу данных, чтобы увидеть, существует ли запись? Я просто смог найти любую хорошую документацию по параметрам БД SQLite на платформе Android.

Любая помощь очень нужна!

Приветствия

Ответы [ 3 ]

6 голосов
/ 30 июля 2010

SQLite имеет команду INSERT OR REPLACE (для краткости REPLACE или используйте SQLiteDatabase.replace()), которая может делать то, что вы хотите.

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

2 голосов
/ 27 сентября 2011

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

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

CREATE TABLE table_name(column_definition, unique(column_names) ON CONFLICT replace);` hen 

Вы можете выполнить вставку как обычно, БД гарантирует, что дубликатов не будет.

2 голосов
/ 30 июля 2010

Вы должны использовать статический метод DatabaseUtils .stringForQuery (), который уже есть в Android SDK, для простого извлечения значения, этот пример предназначен для бота String, также есть метод для Long

stringForQuery(SQLiteDatabase db, String query, String[] selectionArgs)

Служебный метод для запуска запроса к БД и возврата значения в первом столбце первой строки.

Что-то вроде

String myString=DatabaseUtils.stringForQuery(getDB(),query,selectionArgs);

Этот пример должен был получить строковое значение, но вы можете легко приспособиться к получению Long значения, и ваш запрос должен выглядеть примерно так:

select count(*) from mytable where field1='stringtocheckagainst'

если это возвращает число больше нуля, то поле уже существует в базе данных.

Также посмотрите код для обработки изменений ориентации.


ОБНОВЛЕНИЕ @nutone:

В API 11 и выше вы также можете использовать функции DatabaseUtils.queryNumEntries для непосредственного получения количества (отфильтрованных) строк.

long count = DatabaseUtils.queryNumEntries(getDB(), table, query, selectionArgs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...