当前位置: 首页 > 知识库问答 >
问题:

房间SQL自动生成主键返回0或null

赵英资
2023-03-14

所以我的数据库和一个网站实体一起工作

 @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);

我的应用程序崩溃了。创建的每个网站的id为0,外键约束失败。这里出了什么问题?我将primarykey从int更改为INTEGER,当我这样做时,它将主键设置为null,当primarykey为int时,它将id设置为0。发生什么事了?

共有1个答案

戚云
2023-03-14

解决了的。最后我重拨了我的密码。这一次,我从https://github.com/Pavneet-Sing/RoomDemo/blob/master/app/src/main/java/com/example/pavneet_singh/roomdemo/AddNoteActivity.java

具体来说,对于'Insert'异步任务的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
    long insertNote(Note note);

数据库按预期正确自动分配ID。如果一次添加多个注释,也要按照添加注释的顺序进行记录。在这种情况下,不会设置ID,因为每次对数据库的insert调用都会创建一个异步方法。所以我所做的就是添加一个。在每次异步调用之后获取(),以确保所有内容都正确地按时设置

 类似资料:
  • 我遇到了一个问题,我找不到任何关于Android空间和自动生成主键的文档。 我有一个实体类,看起来有点像这样: 当我手动设置id时,这是正常的,但是当我不设置主键时,我得到一个关于主键为空的错误。看着自动生成的文件,我看不到它会自动增加主键的任何地方。 所以我想我的问题是:你能用setter自动生成私有成员的主键吗,或者我需要在setter中手动自动生成我的键吗?

  • 问题内容: 我的主键实体如下所示 当我跑步时,出现错误 无法获取或更新下一个值;嵌套的异常是org.hibernate.exception.SQLGrammerException:无法获取或更新下一个值 但是当我改变为 没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。 问题答案: 当将新创建的实体插入数据库时,告诉JPA提供者使用表从中获取ID。 当使用Hibernate作为提

  • 问题内容: 我有一个SQL语句,例如: 一旦成功,我需要返回自动生成的ID(INT主键),以便可以在第二条语句中使用它。 这可能吗?请提供一个例子。 问题答案: 像这样:

  • 下面的奇怪问题是代码示例,无法创建复合主键 破例 不确定哪里的问题是一切看起来都很好,但当我删除主键注释,这个例外不会出现,对于语法,我遵循官方Android留档。也没有给出有关问题位置的任何详细信息。

  • 我正在使用mySQL数据库,该表有一个由数据库引擎生成的UUID格式的主键。我使用Spring framework JdbcTemplate(https://docs.Spring.io/Spring/docs/current/javadoc-api/index.html?org/springframework/jdbc/core/JdbcTemplate.html)来执行所有操作。但是在插入时,