Проблема с @ForeignKey и 3 сущностями - PullRequest
0 голосов
/ 25 апреля 2019

У меня проблема с @ForeignKey при использовании Room.

У меня есть 3 объекта: Местоположение, Пользователь, Автомобиль.

В одном месте может быть один пользователь.
В одном месте может быть один автомобиль.
Один пользователь может иметь несколько мест.
Один автомобиль может иметь несколько мест (с разными пользователями).

У меня есть список автомобилей. Когда я проведу пальцем влево по одному из них, я смогу создать новое местоположение.

У меня есть две формы, одна для создания нового пользователя (этот новый пользователь отправляется в форму Spinner to Location) и, как указано, одна для создания нового местоположения. В Location, как уже упоминалось, у меня есть Spinner of Users. При создании нового пользователя я сначала сохраняю его, а затем отправляю в местоположение.

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

Итак, когда я сначала добавляю нового пользователя (назовем его Том), а затем новое местоположение с этими новыми пользователями, это прекрасно работает. Я могу видеть это местоположение на пальце справа, все хорошо.

Когда я добавляю второго нового пользователя (назовем его Джерри), он отправляется Spinner, и я могу заполнить форму моего местоположения. Но когда я пытаюсь сохранить эту форму, у меня появляется ошибка внешнего ключа (код 787).

Не могли бы вы помочь, пожалуйста? Я действительно не понимаю, как можно сохранить местоположение Тома, но не Джерри (не оставляйте Джерри одного, пожалуйста ...)

Я проверил эти решения (и многие другие ...), но, похоже, ни у кого нет такой же проблемы, как у меня:

Не удалось выполнить ограничение FOREIGN KEY для Android-комнаты (код 787)
Как избежать ошибки внешнего ключа помещения - ограничение не выполнено (код 787)

Location.java

@Entity(tableName = "location", foreignKeys = {
        @ForeignKey(
                onDelete = ForeignKey.CASCADE,
                entity = User.class,
                parentColumns = "id",
                childColumns = "userId"),
        @ForeignKey(
                onDelete = ForeignKey.CASCADE,
                entity = Car.class,
                parentColumns = "id",
                childColumns = "carId")
})

public class Location implements Parcelable{

    @PrimaryKey (autoGenerate = true)
    private int id;
    private Date dateStart;
    private Date dateEnd;
    private int userId;
    private int carId;


    public Location(Date dateStart, Date dateEnd, int userId, int carId) {
        this.dateStart = dateStart;
        this.dateEnd = dateEnd;
        this.userId = userId;
        this.carId = carId;
    }

Car.java

@SuppressWarnings(RoomWarnings.PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED)
@Entity(tableName = "car")
public class Car implements Parcelable{

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String immatriculation;
    private float price;
    private boolean isRestore;
    private String imagePath;
    private String model;

    @Embedded
    private CarType carType;

    public Car(int id, String immatriculation, float price, boolean isRestore, String imagePath, String model, CarType carType) {
        this.id = id;
        this.immatriculation = immatriculation;
        this.price = price;
        this.isRestore = isRestore;
        this.imagePath = imagePath;
        this.model = model;
        this.carType = carType;
    }

User.java

@Entity(tableName = "user")
public class User implements Parcelable {


    @PrimaryKey(autoGenerate = true)
    private int id;

    private String name;
    private String firstname;
    private String phoneNumber;
    private String email;


    public User(String name, String firstname, String phoneNumber, String email) {
        this.name = name;
        this.firstname = firstname;
        this.phoneNumber = phoneNumber;
        this.email = email;
    }

Я получаю эту ошибку

04-25 08:51:30.312 10581-10709/fr.eni.lokacar E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
    Process: fr.eni.lokacar, PID: 10581
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:353)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:50)
        at android.arch.persistence.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:64)
        at fr.eni.lokacar.dao.LocationDAO_Impl.insert(LocationDAO_Impl.java:112)
        at fr.eni.lokacar.repository.LocationRepository$AsyncInsert.doInBackground(LocationRepository.java:71)
        at fr.eni.lokacar.repository.LocationRepository$AsyncInsert.doInBackground(LocationRepository.java:65)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764)

1 Ответ

0 голосов
/ 25 апреля 2019

Через несколько часов я нашел ответ.

Ответ был в конструкторе Location.

Когда я создал конструктор, у меня есть следующие параметры: dateStart, dateEnd, userId, carId

И когда я инициализирую Location где-то еще, я переключаю значения userId и carId ... Это может никогда не сработать.

Если кто-то заходит на этот пост, и ваш код очень похож на мой, проверьте свою инициализацию:).

Ps: Джерри нашел Тома обратно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...