Android Room插入时使用查询

5
我知道可以通过@Insert注释将数据插入到SQLite room库中,但是我(出于好奇)尝试了使用SQL语句插入值,但Android Studio显示错误,指出列名无法解析。这是强制开发人员使用@Insert注释的一种方式吗?还是我在这里做错了什么?谢谢!
请查看以下截图 - enter image description here
3个回答

3
如果您省略正在突出显示的列列表,并因此为所有列提供值,例如:-
@Query("INSERT INTO TestTable VALUES(null,:a,:b)")
List<TestTable> getall(String a, String b, String columna, String columnb);

Android Studio没有抱怨,但是你会得到一个编译器错误:

error: INSERT query type is not supported yet. You can use:SELECT, DELETE, UPDATE

也许最好越早越好。

感谢您的回答,@MikeT。但是,如果我根据用户的年龄(假设我在“用户”表中有“年龄”列)或时间戳进行条件插入,那该怎么办?如果我的插入时间在通过某些其他查询计算出的时间戳之后,我指的是复杂的查询可能需要引用列名。我希望在使用VALUES数据之后使用列名时不会显示错误。有什么想法吗?再次感谢! - Vijayendra
@DevBoy 没有什么特别的想法,个人更喜欢旧的非ROOM方式。因此只在偶尔尝试ROOM(之前在尝试从资产中复制数据库,所以有一个使用ROOM的项目打开,这就是为什么我尝试了上述方法)。 - MikeT
我明白了。我会尝试找到一个复杂案例的答案。也许我会发布一个带有适当示例的单独问题。现在我接受你的答案。干杯! - Vijayendra
我想插入一列记录,你能告诉我如何使用Room实现吗?我正在尝试以下代码,但它没有起作用:@Query("Insert into SETTINGS_TABLE (KEY_ID) values ('0') ") - Mateen Chaudhry
我今天刚试了一下,对我有效。Android rooms 版本为2.25。如果您有一个主键,请在插入查询语句中使用 null。 - JazzyJ

0
我所做的是在 RoomDatabase 上调用 getOpenHelper().getWritableDatabase()
然后你会得到一个 SupportSQLiteDatabase object,这本质上是非 Room 的方式。
从中,你可以使用表名和 ContentValues 调用 execSQL() 或使用 insert()

0
@Entity
data class ModulesRoom(
    @PrimaryKey(autoGenerate = false)
    var id: Int = 0,
    var nav: String = "",
    var name: String = "",
    var imageurl: String = ""
)
for List Object
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveEmployees(modules: List<ModulesRoom>)

for single obbjet
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveEmployees(modules: ModulesRoom)

Ussage 
val mModules = Modules() 
mModules.id = values
mModules.nav = values 
saveEmployees(mModules)

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