データクラスは次のようになります
@Entity(tableName = "items")
data class Item(
@ColumnInfo(name = "name") var name: String = "",
@ColumnInfo(name = "room") var room: String = "",
@ColumnInfo(name = "quantity") var quantity: String = "",
@ColumnInfo(name = "description") var description: String = "",
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") var id: Long = 0
)
ルームはSQLiteを使用し、SQLiteはデータベース内のNOT NULL列をサポートします。 @NonNullを使用して列に注釈を付けましたが、効果はありません。
ルームデータベースの列をNULL不可にする方法はありますか?
NOT NULLの正確な注釈を識別するために、このリンクで提供されているすべての注釈のリストを調べました: Android.Arch.persistence.room しかし、関連する注釈が見つかりませんでした:
私の想定では、デフォルトでvarをオプションではないものとして扱うKotlinを使用しているため、宣言されたすべての属性はNOT NULLです。 varをオプションとして宣言するには、おそらく?を使用する必要があります。演算子、以下の例:
var name: String // NOT NULL
var name: String? // OPTIONAL
コメントに基づいて更新:
NULLと空の文字列と混同していると思います。 NULLは値がないことを意味します。共有コードでは、空の文字列でありNULLに等しくない各列にデフォルト値を提供しているため、その属性に値を提供していなくても、デフォルトで空の文字列。
属性の値割り当て演算子とRHS値を削除してから、その属性に値を割り当てずにレコードを挿入してください。適切なエラーが発生します。
基本的に、以下のステートメントを変換します。
@ColumnInfo(name = "name") var name: String = ""
に
@ColumnInfo(name = "name") var name: String
Javaの場合、@ Android.support.annotation.NonNullで注釈を付ける必要があります
@ io.reactivex.annotations.NonNullと混同しないでください
Javaを使用しました@NonNull
後に @ColumnInfo
:
@ColumnInfo(name = "column_name")
@NonNull private String str;
クラスに正しいライブラリがインポートされていることを確認してください。
import Android.support.annotation.NonNull;
Kotlinを使用している場合の補完的な回答:
タイプを非オプションとしてマークすると、自動的にnullにならないことに注意してください(オプションのタイプはそれを行いません)。
データベースで@Database(exportSchema = true)
を使用して、roomによって生成されたスキーマで確認できます。
たとえば、次のようなものがあります。
@Entity(tableName = "messages")
data class Message (
@PrimaryKey
val messageId: UUID = UUID.randomUUID(),
val date: Date = Date(),
val receivedDate: Date? = null
)
そして生成されたスキーマで私は読むことができます:
"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (
`messageId` TEXT NOT NULL,
`date` INTEGER NOT NULL,
`receivedDate` INTEGER,
PRIMARY KEY(`messageId`)
)"
(注:ここでは、日付型はInt
であり、UUIDは他の場所で使用するコンバーターのための文字列です)
実際のテーブル制約に対する回避策として、単一のメソッドTypeConverterクラスを使用して、Stringメンバーがnullでないことを確認できます。
たとえば、Null以外の文字列の場合、次を使用できます。
public class RoomConverterNullString {
@TypeConverter
public static String fromNullToString(String value) {
if (value == null) {
return "";
} else {
return value;
}
}
}
もちろん、このように単純化できます:
public class RoomConverterNullString {
@TypeConverter
public static String fromNullToString(String value) {
return (value == null) ? "" : value;
}
}
そして、次のように使用できます。
@TypeConverters(RoomConverterNullString.class)
public String stringMember;
値がnullの場合、割り当てと更新/挿入アクションは空の文字列値を格納し、取得すると空の文字列に強制的にnull値が変換されます。
これは、他のタイプおよび必要なデフォルト値に対して実行できます。