Kotlin开发中如何将字符串ID转为Int作为Room数据库的uid
错误原因
- Unsplash接口返回的图片ID是包含字母、特殊符号的字符串格式,本身不具备转换为Int类型的条件,强制调用
toInt()方法必然触发NumberFormatException异常。 - 你定义的
RoomUnsplashPhoto实体类中,uid字段已经加了@PrimaryKey(autoGenerate = true)注解,代表这个主键是由Room数据库自动生成的自增数值,完全不需要你手动赋值。
解决方案
第一步:修改Room实体类构造
给uid字段设置默认值0,Room自动生成主键时会自动覆盖这个默认值。如果需要避免重复插入同一张Unsplash图片,可新增originalId字段存储Unsplash返回的原始字符串ID,设置唯一约束即可。
修改后的RoomUnsplashPhoto.kt代码:
package com.example.mvvm_retrofit_imagesearchapp.data import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey @Entity data class RoomUnsplashPhoto( @PrimaryKey(autoGenerate = true) val uid: Int = 0, @ColumnInfo(name = "description") val description: String?, @ColumnInfo(name = "url") val url: String?, @ColumnInfo(name="user") val user:String?, // 可选字段:避免重复插入同一张图片 @ColumnInfo(name = "original_unsplash_id", unique = true) val originalId: String? )
第二步:修改Fragment中实体转换逻辑
删除强制转换ID的逻辑,直接构造RoomUnsplashPhoto对象即可:
// 原有的try-catch转换逻辑完全删除,替换为如下代码 val room_photo = RoomUnsplashPhoto( description = photo.description, url = photo.urls.full, user = photo.user.name, originalId = photo.id // 若没加originalId字段则删除此行 )
额外优化建议
- 不要每次点击保存按钮都调用
Room.databaseBuilder新建数据库实例,建议将数据库实例设为全局单例,减少性能损耗。 - 避免使用
GlobalScope启动协程,改用viewLifecycleOwner.lifecycleScope,可以和Fragment生命周期绑定,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

