Страницы

Поиск по вопросам

пятница, 3 января 2020 г.

не обновляется foreign key в дочерней таблице

#java #android #sqlite


Есть две таблицы, в главной таблице есть столбец name, который является ключем для
дочерней таблицы.
Когда я обновляю name, делаю это так:

// перезаписываем данные обьекта
public static void reloadObject(String oldName, String newName, String description,
String date, Context context) {
    ContentValues cv = new ContentValues();
    ObjectDB objectDB = new ObjectDB(context);
    SQLiteDatabase db = objectDB.getWritableDatabase();
    cv.put(ObjectDB.objColumn.NAME, newName);
    cv.put(ObjectDB.objColumn.DESCRIPTION, description);
    cv.put(ObjectDB.objColumn.START_DATE, date);
    db.update(ObjectDB.dbTab.OBJECT, cv, ObjectDB.objColumn.NAME + " = ?", new String[]{oldName});
    db.close();
}


в дочерней таблице этот столбец не обновляется, хотя в настройках таблицы указано:

[object] TEXT REFERENCES geology_object([name]) ON DELETE RESTRICT ON UPDATE CASCADE, 


Если обновить значение name в программе SQLite Expert Personal то все корректно обновляется.
Использую готовую базу данных и вставляю ее в проект с помощью Android SQLiteAssetHelper
    


Ответы

Ответ 1



Нашел ответ на свой вопрос, может кому-то пригодится. Нужно было вставить эту строчку: db.setForeignKeyConstraintsEnabled(true); перед db.update(ObjectDB.dbTab.OBJECT, cv, ObjectDB.objColumn.NAME + " = ?", new String[]{oldName}); и все заработало.

Ответ 2



Я применяю немного другой способ. Перегружаю метод SQLiteOpenHelper.onOpen() @Override public void onOpen(SQLiteDatabase database) { super.onOpen(database); database.execSQL("PRAGMA foreign_keys=ON;"); } тоже работает, причем метод более универсальный, поскольку setForeignKeyConstraintsEnabled() работает только с API 16

Комментариев нет:

Отправить комментарий