在kotlin中使用room(Room Persistence Library)和遇到的坑

下面进入正题,如何在kotlin中使用room;大致与java还是一样的,但是会有几处坑会在文中说道;在文尾会总结

  • 第一步一定要在app 目录下的 builde.gradle加入下面这个插件
apply plugin: 'kotlin-kapt'

//使用生成文件
kapt {
    generateStubs = true
}

1.创建Entity

@Entity(tableName = "story")
@TypeConverters(Converters::class)
data class StoryEntity constructor(
        @PrimaryKey
        @SerializedName("id") var id: Int) {

    constructor() : this(0)

    @ColumnInfo(name = "images")
    @SerializedName("images") var images: Array<String>? = null

    @ColumnInfo(name = "title")
    @SerializedName("title") var title: String? = null

    @ColumnInfo(name = "date")
    var date: Long = 0

    @ColumnInfo(name = "read")
    var read: Int = 0

    @ColumnInfo(name = "like")
    var like: Int = 0

    @ColumnInfo(name = "collection")
    var collection: Int = 0

    /**
     * HTML-Body
     */
    @ColumnInfo(name = "body")
    var body: String? = null

    /**
     * 图片作者
     */
    @ColumnInfo(name = "image_source")
    var image_source: String? = null

    /**
     * 详情头部image
     */
    @ColumnInfo(name = "image")
    var image: String? = null

    /**
     * 时间-文字
     */
    @ColumnInfo(name = "date_string")
    var dateString: String = ""

    override fun toString(): String {
        return "StoryEntity(id=$id, images=${Arrays.toString(images)}," +
                " title=$title," +
                " date=$date," +
                " read=$read," +
                " like=$like," +
                " collection=$collection," +
                " body=$body," +
                " image_source=$image_source," +
                " image=$image," +
                " dateString='$dateString')"
    }
}

* 这里会遇到【坑1】 Entity类需要定义一个空 构造函数


因为sql中不能插入数组这样类型数据,就需要使用到了类型转换器了,这里使用了TypeConverters
关于写类型转换器类会与java不同

/**
 * Created by JokAr on 2017/6/30.
 */
class Converters {
    @TypeConverter
    open fun arrayToString(array: Array<String>): String {
        if (array == null || array.size === 0) {
            return ""
        }

        val builder = StringBuilder(array[0])
        for (i in 1..array.size - 1) {
            builder.append(",").append(array[i])
        }
        return builder.toString()
    }

    @TypeConverter
    open fun StringToArray(value: String): Array<String>? {
        return if (TextUtils.isEmpty(value)) null else value.split(",").toTypedArray()

    }
}


  • 这里会遇到【坑2】,看教程里类型转换器是使用的静态方法的,但是在ktolin若你想使用object 类是不行的,使用普通的class类就可以了;否则生成文件里会报错

2.创建Dao

/**
 * Created by JokAr on 2017/6/30.
 */
@Dao
interface StoryDao {

    /**
     * 插入story
     */
    @Insert
    fun insert(stories: ArrayList<StoryEntity>)

    /**
     * 根据时间获取story
     */
    @Query("SELECT * FROM story WHERE date = :date ")
    fun getStoryByDate(date: Long): List<StoryEntity>

    /**
     * 获取所有收藏的story
     */
    @Query("SELECT * FROM story WHERE collection = 1 ")
    fun getAllCollectedStory(): List<StoryEntity>

    /**
     * 更新story
     */
    @Update
    fun updateStory(story: StoryEntity)

    /**
     * 根据id获取story
     */
    @Query("SELECT * FROM story where id = :id ")
    fun selectStory(id: Int): StoryEntity
}


  • 这里会遇到【坑3】, 方法返回类型不能用ArrayList 他会识别不了,用List就好了
  • 补充一个 这里会遇到【坑4】: insert 的返回值 不能是 Long _impl 生成的是 long 和 kotlin 的Long 类型对不上, 可以用 List 解决这种尴尬;
    “`
    fun insertEntity(vararg entity: UserDBEntity): List

“`

3.创建Database

@Database(entities = arrayOf(StoryEntity::class,
        TopStoryEntity::class), version = 1)
abstract class AppDataBase : RoomDatabase() {

    abstract fun storyDao(): StoryDao
}

4.创建单例模式使用

class AppDataBaseHelper constructor(context: Context) {

    val appDataBase = Room.databaseBuilder(context, AppDataBase::class.java,
            "daily").build()!!

    companion object {
        @Volatile
        var INSTANCE: AppDataBaseHelper? = null

        fun getInstance(context: Context): AppDataBaseHelper {
            if (INSTANCE == null) {
                synchronized(AppDataBaseHelper::class) {
                    if (INSTANCE == null) {
                        INSTANCE = AppDataBaseHelper(context.applicationContext)
                    }
                }
            }
            return INSTANCE!!
        }
    }

    /**
     * 插入topStory
     */
    fun insertTopStory(topStories: ArrayList<TopStoryEntity>) {
        appDataBase.topStoryDao().insert(topStories)
    }

    /**
     * 根据时间获取story
     */
    fun getStoryByDate(date: Long): ArrayList<StoryEntity> {
        return appDataBase.storyDao().getStoryByDate(date) as ArrayList<StoryEntity>
    }

    /**
     * 根据id获取story
     */
    fun getStory(id: Int): StoryEntity{
        return appDataBase.storyDao().selectStory(id)
    }

    /**
     * 更新story;必须在非主线程中进行
     */
    fun updateStory(story: StoryEntity) {
        appDataBase.storyDao().updateStory(story)
    }
}

5.坑总结

  • 【坑1】 Entity类需要定义一个空 构造函数
  • 【坑2】类型转换器使用object 类是不行的,使用普通的class类就可以了;否则生成文件里会报错
  • 【坑3】Dao方法返回类型不能用ArrayList 他会识别不了,用List就好了
  • 【坑4】 insert 的返回值 不能是 Long _impl 生成的是 long 和 kotlin 的Long 类型对不上, 可以用 List 解决

*暂时就遇到这么多坑,若再遇到其他会补充上的;


若想看具体的使用方法,可以参考我的这个项目

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Kotlin使用Room数据库是一种常见的做法,Room是Google官方提供的一个SQLite对象映射库,用于简化与SQLite数据库的交互。以下是使用Room数据库的几个步骤: 1. 添加依赖:在项目的`build.gradle`文件添加以下依赖: ```kotlin implementation "androidx.room:room-runtime:2.4.0" kapt "androidx.room:room-compiler:2.4.0" ``` 2. 创建实体类:创建一个Kotlin类来表示数据库的表,并使用`@Entity`注解标记它。例如,如果我们要创建一个名为`User`的表,可以这样写: ```kotlin @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, val name: String, val age: Int ) ``` 3. 创建DAO接口:创建一个Kotlin接口来定义访问数据库的操作,并使用`@Dao`注解标记它。例如,如果我们要创建一个名为`UserDao`的接口,可以这样写: ```kotlin @Dao interface UserDao { @Query("SELECT * FROM users") fun getAll(): List<User> @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) } ``` 4. 创建数据库:创建一个继承自`RoomDatabase`的抽象类,并在其定义数据库的实例和DAO接口的访问方法。例如,如果我们要创建一个名为`AppDatabase`的数据库类,可以这样写: ```kotlin @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } ``` 5. 初始化数据库:在应用程序的入口处(通常是`Application`类的`onCreate()`方法),使用`Room.databaseBuilder`方法来创建数据库的实例。例如: ```kotlin val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() ``` 6. 使用数据库:通过调用DAO接口定义的方法,可以进行数据库的增删改查操作。例如: ```kotlin val userDao = db.userDao() val allUsers = userDao.getAll() userDao.insertAll(User(1, "John Doe", 25)) val user = userDao.getAll().first() userDao.delete(user) ``` 这些是使用KotlinRoom数据库的基本步骤,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值