You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:45:00