Intereting Posts
Android Maven Eclipse по-прежнему не может импортировать apklib Разрешение экрана Android Как получить метод с разными параметрами? Как определить жирный шрифт в селекторе Android? Несколько вопросов о курсах базы данных SQLite в Android Как добавить событие click с Android UiAutomation.injectInputEvent Apache HttpClient 4.0 не работает с тайм-аутом для сокета на Android Android, как передать Activity.class в качестве аргумента для функции Есть ли список того, какое устройство имеет то, что отделяет dpi и размер экрана? Применение stateListAnimator в элементе RecylerView вызовет мерцающий эффект при вызове notifyDataSetChanged Невозможно получить AuthToken для пользовательской учетной записи из другого приложения. Исключение для Android: вам нужно использовать тему Theme.AppCompat с этой деятельностью PreferenceFragment – Разница между getPreferenceManager () и getPreferenceScreen ()? Android-видеопоток в MediaPlayer и кодирование с помощью MediaCodec Проблема с андроидом Edittext

Как достичь взаимосвязи «Наследование» в базе данных SQLite на Android

Рассмотрим эту простую модель:

Таблица местоположений базы:

+-------------------------------+ | Locations | +-------------------------------+ |(PK) _id Integer Autoincrement | | name Text(100) Not null | | is_in_range Integer | +-------------------------------+ 

И более специализированная таблица под названием WifiLocation:

 +-------------------------------+ | wifi_location | +-------------------------------+ | ssid Text(0) Not null | | signal_threshold Real | |(PK) _id Integer | +-------------------------------+ 

Я хочу, чтобы эта модель представляла WifiLocation наследуемую от BaseLocation . Поэтому я добавил предложение REFERENCES в столбце wifi_locations таблицы wifi_locations следующим образом:

 CREATE TABLE wifi_locations (_id Integer primary key references Locations(_id), ....) 

Я пытаюсь достичь отношения 1: 1 между этими таблицами.

Когда я хочу вставить строку в таблицу wifi_locations , сначала вставьте соответствующие значения (Name, IsInRange) в таблицу Locations и верните rowId . Затем я вставляю остальные данные (ssid) в таблицу wifi_locations вместе с rowId как внешний ключ.

Таким образом, вставка в таблицу Location работает, и я возвращаю идентификатор, но когда я пытаюсь использовать этот идентификатор и вставляю его в таблицу wifi_locations, я получаю ошибку Constraint violation SQL Constraint violation . Больше нет подробностей о том, что точно пошло не так.

Что-то не так с моей схемой? Есть ли лучший способ добиться такого моделирования?

РЕДАКТИРОВАТЬ:

Точная ошибка:

 06-16 15:56:42.846: E/Database(2038): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 

Solutions Collecting From Web of "Как достичь взаимосвязи «Наследование» в базе данных SQLite на Android"

Вы должны создать FOREIGN KEY в своей второй таблице, ссылаясь на таблицу PRIMARY KEY в Locations. В SQLite FOREIGN KEYS поддерживаются, но неявно не включены, поэтому сначала вы должны включить их.

 final String ENABLE_FOREIGN_KEYS ="PRAGMA foreign_keys=ON"; db.execSQL(ENABLE_FOREIGN_KEYS); 

В вашем onOpen() SQLiteOpenHelper .

Затем ваш FOREIGN KEY выглядит так:

 CREATE TABLE wifi_location ( SSID TEXT NOT NULL, SIGNAL_THRESHOLD REAL, _id INTEGER, FOREIGN KEY(_id) REFERENCES Locations(_id) ); 

Итак, но все это работает с SQLite version 3.6.19 . Для получения дополнительной информации см. Поддержка внешних ключей SQLite .