你必须使用@NonNull注释主键吗?

10

我在这段代码中遇到了错误。You must annotate primary keys with @NonNull. "uidString" is nullable. 当我使用@NonNull和@PrimaryKey进行注释时,An entity must have at least 1 field annotated with @PrimaryKey

发生了什么问题?

import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

import java.util.UUID;

@Entity(tableName = "player_profiles")
public class PlayerGameProfile implements Parcelable {

    @PrimaryKey
    public String uidString = UUID.randomUUID().toString();

    @ColumnInfo(name = "name")
    public String name;


1
当我用@NonNull进行注释时,实体必须至少有1个带有@PrimaryKey注释的字段。你是否同时使用了__both__或只使用了@NonNull - tkausl
后者同时具备两种。我尝试改变顺序,但仍然如此。 - microflakes
请确保导入正确的NonNull包:import android.support.annotation.NonNull; - Tiberiu Zulean
是的,抱歉代码粘贴得有些潦草,但所有内容都已经呈现出来了。楼主已经进行了编辑。 - microflakes
我尝试了您的方法,没有得到任何编译或构建错误。问题出在其他地方,而不是注解上。另外,我使用了AndroidX注解,而不是支持注解。 - Shankha057
你有最新的库吗?根据Shankha507的工作正常(并尝试交换@NonNull与@PrimaryKey的位置)。我正在使用implementation 'androidx.room:room-runtime:2.2.1'annotationProcessor 'androidx.room:room-compiler:2.2.1'。我之前在早期的库中遇到了看起来相同的问题。 - MikeT
4个回答

6
对于Java,您应该使用注释@android.support.annotation.NonNull
删除您正在使用的其他NonNull导入,并将其更改为:
import android.support.annotation.NonNull;

然后同时使用这两个注解

@PrimaryKey
@NonNull

谢谢!由于某些原因,androidx.annotation.NonNull无法正常工作。 - Pranav

2
在我的情况下,我有:
@PrimaryKey @NonNull var reasonId: String? = Constants.EMPTY_STRING, 

改为:

@PrimaryKey @NonNull var reasonId: String = Constants.EMPTY_STRING, 


如果您正在编写Kotlin代码,则不需要使用@NonNull,只要使用非空类型即可。 - JensV

0

检查大小写敏感性,应该是"@NonNull"而不是"@Nonnull" 导入 androidx.annotation.NonNull;


这实际上就是问题中所说的文本。 - Ryan M

0
您可以尝试将主键与实体绑定,像这样:

@Entity(tableName = "player_profiles",
        primaryKeys = { "uidString" })

在下面的类中,使用@NonNull注释您的主键。
@NonNull
public String uidString = UUID.randomUUID().toString();

仍然出现第二个错误,至少需要一个主键。 - microflakes
1
还要确保您尝试我的评论中提到的NonNull的其他导入包:import android.support.annotation.NonNull - Tiberiu Zulean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接