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

2024-01-06

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

我冒昧地使用了谷歌的code https://developer.android.com/reference/androidx/room/Insert:

// 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 的数据库浏览器,我添加了另一个条目,在这里我获得了时间戳。

如何在房间中插入没有空时间戳的内容?

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


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

按照 :-

查询方法支持 4 种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。Query https://developer.android.com/reference/androidx/room/Query

e.g.

@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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在房间SQLite数据库中自动设置时间戳? 的相关文章

  • 在 Objective C 中使用 NSMutableArray 对象的指针

    当在 cocoa touch 中从 NSMutableArray 检索对象时 下面的代码可以吗 我应该每次分配 alloc 新的 Page 对象还是只是指向它 我是否需要对 Page pageObj 之后执行任何操作 例如将其设置为 nil
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 仅将唯一行插入 SQLite (python)

    我在用着cursor executemany将 CSV 文件中的批量行插入到 SQLite 表中 根据主键字段 其中一些行预计会重复 当我执行该命令时 可以预见的是 我会收到完整性错误 并且不会插入任何内容 如何有选择地仅插入非重复行 而无
  • SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)

    我正在寻找一种方法 以不区分大小写的方式对 C 中的 UTF 8 字符串进行比较和排序 以便在SQLite 中的自定义排序规则函数 http www sqlite org c3ref create collation html 该方法应该i
  • Cordova SQLite 保存 BLOB

    我的 Cordova SQLite 插件有问题 如何将 BLOB 图像保存到 SQLite 我在 JS 中有 BLOB 对象 Blob size 96874 type image jpeg proto Blob length 1 我试图拯救
  • 从 Core Data、iOS 获取最后插入的项目

    有没有办法获取核心数据数据库中最后插入的项目 这将返回最后插入的对象 setFetchLimit 1 和 setFetchOffset 所有条目数 1
  • 在 SQL 语句的 WHERE 子句中将 string 转换为 int

    我想实现这个目标 SELECT FROM linkledger WHERE toInt reputation gt 100 但是函数 toInt 不存在 有吗 我现在发现了这个 但不起作用 这意味着我有一个更根本的问题 因为这是正确的 SE
  • 如何在android中批量插入sqlite

    我正在使用 SQLiteOpenHelper 进行数据插入 我需要插入2500个id和2500个名字 所以花费了太多时间 请任何人帮助我如何减少插入时间 我们可以一次插入多条记录吗 任何人都可以帮助我 先感谢您 代码 public clas
  • 如何在sqlite中添加特定数量的空行?

    我有一个SQLite文件 我想添加2550 empty NULL rows 我可以使用此代码添加一个空行 INSERT INTO my table DEFAULT VALUES 但我需要 2550 行 有什么捷径吗 我不想执行相同的代码 2
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • iPhone,sqlite3,如何尽可能用几行代码确定一个表是否已经存在?

    在开始再次向表添加数据之前 如何以尽可能少的代码行确定表中已经存在 如果直接使用sqlite 可以使用以下查询来查看表是否已经存在 SELECT name FROM sqlite master WHERE type table AND na
  • 检测SQLite3中的FTS3扩展

    用于检测是否安装了 FTS3 扩展模块的 SQLite 查询是什么 或者是否可以使用 SQLite3 查询获取已安装扩展的列表 它必须与pysqlite2 我知道我可以使用以下命令获取表格列表SELECT FROM sqlite maste
  • iPhone 存储图像的最佳方式

    我正在开发一个应用程序 需要缓存一些来自网络的图像 图像可能是 100x100 我只需要知道哪个更好 将图像作为文件存储在 iPhone 文件系统中 将它们作为 blob 与已保存在数据库中的其他数据一起存储在 sqlite 数据库中 感谢
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 获取 Blob 图像并将该图像转换为 Bitmap 图像

    我正在从数据库中获取 blob 格式的图像 我想将其转换为位图图像 我用来将位图转换为 Blob 的代码放在下面 但是请告诉我如何反转它 ByteArrayOutputStream boas new ByteArrayOutputStrea
  • 如何在android上的查询中添加WHERE子句

    我想将结果限制为 KEY HOMEID 等于journalId 的结果 我已经研究这个问题几天了 任何帮助将不胜感激 public Cursor fetchAllNotes String journalId return mDb query
  • 在 SQLite 数据库的特定位置插入一行

    我正在 SQLite Manager 中创建数据库 并且错误地忘记提及一行 现在 我想在中间手动添加一行 在其下方 其余的自动增量键应自动增加 1 我希望我的问题很清楚 Thanks 您不应该关心键值 只需在末尾附加行即可 如果您确实需要这
  • 带外键或不带外键的引用有什么区别

    关于SQLite 带外键或不带外键的引用有什么区别 这有什么区别 CREATE TABLE players set id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL player id INTEGE
  • NuGet安装的Visual Studio 2012中的Sqlite在用于连接的数据源中不存在

    我有 Visual Studio 2012 Premium 并通过 NuGet Packages API 安装了 System Data SQLite x86 x64 我将所有可用的 SQLLite 引用添加到我的 WPF x86 Net

随机推荐