在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()

    }
}

</br>


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

</br>

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
}

</br>


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

</br>

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<Long> 解决

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容