Android Room defaultValue="CURRENT_TIMESTAMP" 不起作用

Mer*_*men 5 sqlite android android-room

我正在尝试将 Room 2.2 附带的架构默认值实现到我的实体,但它似乎不起作用。

我有一个名为 Place 的实体:

@Entity
public class Place implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    private Long placeId;

    private String name;

    private double latitude;

    private double longitude;

    private int radius;

    @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
    private String createdAt;

    @Ignore
    public Place() {}

    public Place(String name, double latitude, double longitude, int radius) {
        this.name = name;
        this.latitude = latitude;
        this.longitude = longitude;
        this.radius = radius;
    }

    // getters and setters...

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

}
Run Code Online (Sandbox Code Playgroud)


当一个地方被插入到数据库中时,createdAt字段总是被插入为 NULL。

在此输入图像描述


createdAt将变量 更改为long将字段替换为 0。

我在这里做错了什么?

Mik*_*keT 5

您可以将@Query与特定的列名称(和值)一起使用,但不包括默认的列名称。

按照 :-

请注意,如果您只是使用 @Insert 插入实体,则不会使用您在此处指定的默认值。在这种情况下,将使用 Java/Kotlin 中分配的任何值。将 @Query 与 INSERT 语句一起使用并跳过此列以使用此默认值。默认值

所以在这种情况下你可以使用:-

@Query("INSERT INTO Place (name,latitude,longitude,radius) VALUES(:name,:latitude,:logitude,:radius)")
Run Code Online (Sandbox Code Playgroud)

原因是除了rowid的别名之外。如果在显式或隐式指定列名的情况下传递 null,则不使用默认值,因此值存储为 null。

考虑 :-

DROP TABLE IF EXISTS place;
CREATE TABLE IF NOT EXISTS `Place` (`placeId` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `latitude` REAL NOT NULL, `longitude` REAL NOT NULL, `radius` INTEGER NOT NULL, `createdAt` TEXT DEFAULT CURRENT_TIMESTAMP);

INSERT INTO place VALUES(null,'opt1',0,0,0,null); //<<<< As per @Insert
INSERT INTO place (name,latitude,longitude,radius) VALUES('opt2',1,1,1); //<<<< As per @Query
SELECT * FROM place;
Run Code Online (Sandbox Code Playgroud)

结果:-

在此输入图像描述

Room 实际上构建了以下 2 个查询(根据生成的代码)

"INSERT OR ABORT INTO `Place` (`placeId`,`name`,`latitude`,`longitude`,`radius`,`createdAt`) VALUES (?,?,?,?,?,?)"
Run Code Online (Sandbox Code Playgroud)

"INSERT INTO place (name,latitude,longitude,radius) VALUES(?, ?, ?, ?)"
Run Code Online (Sandbox Code Playgroud)