Emm,数据库。谷歌的Room本身也不多大特别。
诚如Greendao也是非常好的东西。
但是,既然Room是Jetpack全家桶里面的东西,那么既然都Jetpack了,当然要Room了。
全家桶呀全家桶,搭配天然爽歪歪。
来吧,少年。
一些基础装备
- build.gradle (项目级)
ext { roomVersion = '2.4.2' }
- build.gradle (app)
dependencies{
//ktx
implementation 'androidx.core:core-ktx:1.8.0'
// room
implementation "androidx.room:room-runtime:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:2.3.0"
}
一、Room数据库
我们知道,数据库嘛
经典三叉戟,实体类
,Dao
,数据库(database)
然后一般,弄多一个办理类。来办理 数据库
那就来吧
一个简单学生数据库,增修正查
实体类
/**
*
* 数据实体
*
* 1、@Entity:Room实体类注解 ---> 默认情况下,Room 将【类称号】用作数据库【表称号】
* 注:如果您期望【数据库表】具有不同的称号,请设置 @Entity 注解的 tableName 属性
* 2、PrimaryKey: 主键( autoGenerate = true 主键自增 ),效果:唯一标识相应数据库表中的每一行
* 3、@ColumnInfo:数据库表字段---> 默认情况下,运用【字段称号】作为数据库中的【列称号】
* 注:如果您期望【数据表里的列】具有不同的称号,请将 @ColumnInfo 注解添加到该字段并设置 name 属性
* 4、Ignore: 默认情况下,Room 会为实体中界说的每个字段创立一个列。 如果您不想保留该字段,则能够运用 @Ignore 为字段添加注解
*/
@Entity(tableName = "loginUser")
data class User(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
@ColumnInfo(name = "name")
var aliasName: String = "",
var age: Int = 0,
) {
constructor(aliasName: String, age: Int) : this() {
this.aliasName = aliasName
this.age = age
}
}
Dao 操作类
/**
* 数据拜访目标
*/
@Dao
interface UserDao {
// 查询
@Query("SELECT * FROM loginUser")
fun queryAllUser(): MutableList<User>
//根据名字参数查询
@Query("SELECT * FROM loginUser WHERE name = :name")
fun queryFindUser(name: String): User?
// 添加单条数据
@Insert
fun addUser(vararg user: User)
// 添加批量数据
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addBatchUser(list: MutableList<User>)
// 更新某一个数据
@Update
fun updateUser(vararg user: User)
//更新所有数据
@Query("UPDATE loginUser set age='50'")
fun updateAll()
//删去某一个数据
@Delete
fun deleteSingle(vararg user: User)
@Query("DELETE FROM loginUser WHERE name = :focusName")
fun deleteSingleByName(focusName: String)
//删去表里所有数据
@Query("DELETE FROM loginUser")
fun deleteAllUser()
}
Database类
/**
* 数据库创立
* entities: 实体类
* version: 数据库初始版别号
* exportSchema: 是否答应数据库架构将导出到给定的文件夹中【 默认true 】
*
*/
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
//创立userDao
abstract fun userDao(): UserDao
}
Manager类 (也能够不要)
object DbManager {
//数据库名
private const val dbName: String = "userroom"
//懒加载创立数据库
val db: UserDatabase by lazy {
Room.databaseBuilder(
App.appContext.applicationContext, UserDatabase::class.java, dbName
).allowMainThreadQueries()//答应在主线程操作
.build()
}
}
运行
activity
class MainActivity : AppCompatActivity() {
var userDao: UserDao = DbManager.db.userDao()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
userDao.deleteAllUser()
// 添加
val age1 = Random.nextInt(20, 40)
val user1 = User("张三", age1)
userDao.addUser(user1)
findViewById<Button>(R.id.btnAdd).setOnClickListener {
val age2 = Random.nextInt(20, 40)
val user2 = User("李四", age2)
userDao.addUser(user2)
queryAllUserPrint("添加")
Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show()
}
findViewById<Button>(R.id.btnDelete).setOnClickListener {
// 删去
userDao.deleteSingleByName("李四")
queryAllUserPrint("删去")
}
findViewById<Button>(R.id.btnUpdate).setOnClickListener {
// 修正
val queryAllUser = userDao.queryFindUser("张三")
if(queryAllUser!=null){
queryAllUser.age = 66
userDao.updateUser(queryAllUser)
}
queryAllUserPrint("修正")
}
findViewById<Button>(R.id.btnQuery).setOnClickListener {
// 查
queryAllUserPrint("只是查询")
}
}
private fun queryAllUserPrint(tips: String) {
val tvResult = findViewById<TextView>(R.id.tvResult)
tvResult.setText("")
Log.d("User", "================ " + tips + " ================")
val queryAllUser = userDao.queryAllUser()
var allResultStr = ""
for (entity in queryAllUser) {
var restltStr = "用户 ${entity.aliasName} 年龄:${entity.age}"
Log.d("User", restltStr)
allResultStr = allResultStr+restltStr+"\n"
}
tvResult.setText(allResultStr)
}
}
APP
class App : Application() {
companion object {
lateinit var appContext: Context
}
override fun onCreate() {
super.onCreate()
appContext = applicationContext
}
}
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity"
android:gravity="center"
>
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加"/>
<Button
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删去"/>
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修正"/>
<Button
android:id="@+id/btnQuery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"/>
<TextView
android:id="@+id/tvResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="result"
/>
<!-- <EditText-->
<!-- android:id="@+id/searchBox"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:hint="Search Keyword" />-->
<!-- <TextView-->
<!-- android:id="@+id/searchResultsText"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginTop="16dp"-->
<!-- android:text="Search Results" />-->
</LinearLayout>
输出
按下添加
================ 添加 ================
用户 张三 年龄:37
用户 李四 年龄:24
按下删去
================ 删去 ================
用户 张三 年龄:37
按下修正
================ 修正 ================
用户 张三 年龄:66
按下查询
================ 只是查询 ================
用户 张三 年龄:66
最简单版别,完毕。
升级的,这儿就不展开了
参考:/post/709815…