Intereting Posts
PopupWindow вне экрана, когда размер неуточнен Как поднять тост в AsyncTask, мне предлагается использовать Looper Клиент jquery signalr работает, но в java его нельзя заставить работать Android медленное открытие мягкой клавиатуры Рекомендуемый способ получить активность внутри экрана раствора? Новый пакет еще не зарегистрирован в системе. Ошибка на реальном телефоне Как автоматически импортировать необходимые классы в Android Studio с помощью ярлыка? Лучший способ связи службы с активностью (трансляция, обратные вызовы и т. Д.) Void android.support.v4.app.Fragment.setMenuVisibility (boolean) 'для ссылки на нулевой объект Показывать пароль с помощью EditText Как запустить / запустить приложение во время загрузки Android Добавить новые регистры на байт-код Dalvik Как добавить больше фреймов, таких как Nexus 6P, 5X и т. Д. В скриншотах в студии Android Удалять приложение программно (Android) Получить реальные координаты x и y пользователей

Как достичь взаимосвязи «Наследование» в базе данных 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 .