gpt4 book ai didi

sqlite - 如何在房间 SQLite 数据库中自动设置时间戳?

转载 作者:行者123 更新时间:2023-12-03 18:32:04 28 4
gpt4 key购买 nike

我试图让 SQLite 使用 CURRENT_TIMESTAMP 创建自动时间戳。

我冒昧使用谷歌的 code :

// roomVersion = '2.2.2'
@Entity
public class Playlist {
@PrimaryKey(autoGenerate = true)
long playlistId;
String name;
@Nullable
String description;
@ColumnInfo(defaultValue = "normal")
String category;
@ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
String createdTime;
@ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
String lastModifiedTime;
}

@Dao
interface PlaylistDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(playlist: Playlist): Long
}

这转化为 SQLite 语句:
CREATE TABLE `Playlist` (
`playlistId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` TEXT,
`description` TEXT,
`category` TEXT DEFAULT 'normal',
`createdTime` TEXT DEFAULT CURRENT_TIMESTAMP,
`lastModifiedTime` TEXT DEFAULT CURRENT_TIMESTAMP
)

我确实做了一个插入:
mDb.playListDao().insert(Playlist().apply { name = "Test 1" })

但时间戳始终为空。

使用 SQLite 的 DB 浏览器,我添加了另一个条目,在这里我得到了时间戳。

如何在没有空时间戳的情况下插入房间?

(信息:createdTime 也总是与 lastModifiedTime 相同。我认为这必须通过 SQLite 中的触发器来完成,但这是一个不同的问题,这里不讨论)。

screenshot playlist db entries

最佳答案

你不需要使用另一个类,你可以使用 @Query作为便利的替代方案 @Insert .

按照 :-

There are 4 type of statements supported in Query methods: SELECT, INSERT, UPDATE, and DELETE. Query



例如
@Query("INSERT INTO test_table001 (name) VALUES(:name) ")
void insert(String name);

您也不限于将 CURRENT_TIMESTAMP 作为获取当前时间戳的唯一方法,您可以使用嵌入式日期时间函数(如下所示),它可以更有效地存储值,也更灵活,例如您可以使用诸如“+7 天”之类的修饰符来调整当前时间。

如果您考虑以下几点:-
@Entity(tableName = "test_table001")
public class TestTable001 {

@PrimaryKey
Long id;
@ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
String dt1;
@ColumnInfo(defaultValue = "(datetime('now'))")
String dt2;
@ColumnInfo(defaultValue = "(strftime('%s','now'))")
String dt3;
String name;
}
  • 注意低效autogenerate = true尚未使用,但正如将显示的那样,您仍然可以为 SQLite 分配 id(请注意,您必须使用 Long/Integer 类型,而不是 long 或 int)
  • 还要注意获取当前日期时间的替代方法(后者效率更高,因为该值最终将存储为整数(最多 8 个字节)而不是更多字节的字符串)。

  • 以道为:-
    @Dao
    public interface TestTable001Dao {

    @Insert()
    long insert(TestTable001 testTable001);

    @Query("INSERT INTO test_table001 (name) VALUES(:name) ")
    long insert(String name);

    @Query("SELECT * FROM test_table001")
    List<TestTable001> getAllTestTable001();
    }

    以及以下要测试/演示的内容:-
    public class MainActivity extends AppCompatActivity {

    AppDatabase mRoomDB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mRoomDB = Room.databaseBuilder(this,AppDatabase.class,"testdb")
    .allowMainThreadQueries()
    .build();

    TestTable001 tt01 = new TestTable001();
    tt01.setName("tt01");
    mRoomDB.useTestTable001().insert(tt01);
    mRoomDB.useTestTable001().insert("tt02");

    logAllTestTable001();
    }

    private void logAllTestTable001() {
    for (TestTable001 tt: mRoomDB.useTestTable001().getAllTestTable001()) {
    Log.d(
    "TTINFO",
    "ID = " + tt.getId() +
    " Name = " + tt.getName() +
    " Date1 = " + tt.getDt1() +
    " Date2 = " + tt.getDt2() +
    " Date3 = " + tt.getDt3());
    }
    }
    }

    结果是:-
    2019-12-14 03:18:32.569 D/TTINFO: ID = 1 Name = tt01 Date1 = null Date2 = null Date3 = null
    2019-12-14 03:18:32.569 D/TTINFO: ID = 2 Name = tt02 Date1 = 2019-12-13 16:18:32 Date2 = 2019-12-13 16:18:32 Date3 = 1576253912

    关于sqlite - 如何在房间 SQLite 数据库中自动设置时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323938/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com