Комнатный SQL автоматически генерирует первичный ключ, возвращающий 0 или ноль - PullRequest
0 голосов
/ 07 февраля 2019

Итак, моя база данных работала с одной сущностью веб-сайта

 @Entity(tableName = "website_table") public class Website {

     @NonNull
     @PrimaryKey(autoGenerate = true)
     private Integer websiteId;

     private String title;
     private String base_URL;
     private String description;


     public Website(String title, String base_URL) {
         this.title = title;
         this.base_URL = base_URL;
     }

     public void setWebsiteId(Integer websiteId) {
         this.websiteId = websiteId;
     }

     public Integer getWebsiteId() {
         return websiteId;
     }

     public String getTitle() {
         return title;
     }

     public String getDescription() {
         return description;
     }

     public void setDescription(String description) {
         this.description = description;
     }

     public String getBase_URL() { return base_URL; }

     public void setBase_URL(String base_URL) { this.base_URL = base_URL; }
   }

@Dao
public interface WebsiteDao {

    @Insert
    void insert(Website website);

    @Update
    void update(Website website);

    @Delete
    void delete(Website website);

    @Query("DELETE FROM website_table")
    void deleteAllWebsites();

    @Query("SELECT * FROM website_table ORDER BY title DESC")
    LiveData<List<Website>> getAllWebsites();

    @Query("SELECT * FROM website_table")
    public List<WebsiteWithWebPages> loadWebsitesWithWebPages();
}

Затем я попытался добавить связь для веб-страниц на веб-сайте

    public class WebsiteWithWebPages {
        @Embedded
        public Website website;

        @Relation(parentColumn = "websiteId", entityColumn = "website_Id", 

        entity = WebPage.class)
        public List<WebPage> webPageList;
    }

@Entity(tableName = "webpage_table")
public class WebPage {
    @PrimaryKey(autoGenerate = true)
    public Integer webPageId;

    public final String name;
    public final String url;
    public String description;
    public final Integer website_Id;

    public WebPage(String name, String url, final Integer website_Id) {
        this.name = name;
        this.url = url;
        this.website_Id = website_Id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getUrl() {
        return url;
    }

    public Integer getWebsiteId() {
        return website_Id;
    }
}

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

Website website= new Website("website name", "websiteurl");
        websiteDao.insert(website);

Мое приложение вылетает.каждому созданному веб-сайту присваивается идентификатор 0, и ограничение FOREIGN KEY не выполняется.Что здесь не так?Я изменил primarykey с int на INTEGER, и когда я сделал это, он установил первичный ключ как null, а когда primarykey имеет значение int, он установил id в 0. Что происходит?

1 Ответ

0 голосов
/ 10 февраля 2019

решаемая.В конце я переделал свой код.На этот раз я скопировал из https://github.com/Pavneet-Sing/RoomDemo/blob/master/app/src/main/java/com/example/pavneet_singh/roomdemo/AddNoteActivity.java

В частности, для DoInBackground для асинхронной задачи «Вставка», есть код `

protected Boolean doInBackground(Void... objs) {
            // retrieve auto incremented note id
            long j = activityReference.get().noteDatabase.getNoteDao().insertNote(note);
            note.setNote_id(j);
            Log.e("ID ", "doInBackground: "+j );
            return true;
        }

И с возвращением метода Insert Daolong

 @Insert
    long insertNote(Note note);

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

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