JetPack----Room

149 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

JetPack----Room

在任何一个程序中,无外乎就是在不停的和数据进行交互,不停的去操作数据。在Android中就会遇到一些问题,比如一些关键性的信息我不希望内存回收、程序意外终止而导致数据丢失。这个时候我们就需要让我们的数据持久化。在Android中我们是怎么样让我们的数据持久化呢?Android系统中主要提供了三种方式便于我们实现数据持久化功能:文件存储,SharePreferences存储和数据库存储。下面我们那就数据库存储进行详细的讲解。

Sqlite是一款轻量级的关系型数据库,他的运算速度非常的快,占用资源很少。并且只要你之前使用过其他的关系型数据库,你就会很快的上手Sqlite,在最开始学习Android开发的时候我想大家都忘不了SQLiteOpenHelper,我们操作数据库都是通过它来进行操作,我们主要的使用步骤如下:

  • 通过SQLiteOpenHelper的两个实例方法getReadableDatabase()getWriteableDatabase() 来进行数据的创建或者打开

    创建的数据库文件后缀是*.db ,通常存放在data/data/<package name>/databases/目录下

  • 然后我们在实现的Helper类中实现自己业务逻辑Sql查询数据的封装

class myDataBaseHelper(val context:Context,name:String,version:Int):SQLiteOpenHelper(context,name,null,version){
    //数据库创建时会调用OnCreate
	override fun onCreate(db:SQLiteDataBase){
        db.execSQL("SQL语句")
    }
    
    override fun onUpgrade(db:SQLiteDataBase,oldVersion:Int,newVersion:Int){
        
    }
    
    //可以在此进行自己的Sql业务封装
    fun testSql(db:SQLiteDataBase){
        db.execSQL("")
    }
}
class MainActivity : Activity(){
    val dbHelper = myDataBaseHelper(this,"Demo.db",1)
    override fun onCreate(db:SQLiteDataBase){
       val db = dbHelper.getReadableDatabase()
       dbHelper.testSql(db)
    }
}

以前是用Sqlite进行本地化开发大家都离不开这样的开发模式,需要自己去调用原生的API来进行数据的增删改查,这样会让我们的项目代码变得非常混乱并且难以维护,除非你对此进行了很好的封装,为此市面上出现了很多的ORM框架(ORM也叫对象关系映射,将面向对象的编程语言和面向关系的数据库之间建立一种映射关系),为此Google为了方便我们进行开发推出了一个ORM框架-Room,并且将它加入到了JetPack

Room的整体结构分为Entity、DAO、DataBase这三个部分每个部分负责的职责不同:

  • Entity:用于定义封装实际数据的实体类,每个实体类都会在库中生成对应生成,并且字段也是自动根据实习类中的字段自动生成
  • DAO:数据访问对象,顾名思义,就是用来对数据库进行各项操作的地方,在实际编程中我们就只需要和Dao层打交道
  • DataBase:用于定义数据库中的关键信息,包括数据库的版本号,包括那些实体类以及提供Dao层的访问实例

定义实体类

data class Person(
    @PrimaryKey(autoGenerate = true)
	val name:String,
    @ColumInfo("person_age") //表字段名
    val age:Int
)

Dao层的实现

interface PersonDao{
    @Insert
    fun insertPerson(person:Person):Long //返回插入列的索引值
    @Update
    fun insertPerson(newPerson:Person)
    
    @Query("SELECT * FROM Person")
    fun loadAllPerson():List<Person>
    
    @Delete
    fun deletePerson(p:Person)
   
    @Query("DELETE * FROM Person")
    fun deleteAllPerson()
}