- 添加插件
- 添加依赖
implementation "androidx.room:room-runtime:2.3.0" kapt "androidx.room:room-compiler:2.3.0"
- 布局
Room的使用 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/salary_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" app:layout_constraintBaseline_toBaselineOf="@+id/salary_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="@+id/guideline3" /> <Button android:id="@+id/add_user_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加用户" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/salary_edit" app:layout_constraintVertical_bias="0.051" /> <TextView android:id="@+id/name_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请输入名称:" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/age_text" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.11" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="123dp" /> <TextView android:id="@+id/age_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请输入年龄:" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintTop_toBottomOf="@+id/name_text" app:layout_constraintVertical_bias="0.058" /> <TextView android:id="@+id/salary_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="72dp" android:text="请输入薪水:" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/age_text" app:layout_constraintVertical_bias="0.066" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="132dp" /> <EditText android:id="@+id/name_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" app:layout_constraintBaseline_toBaselineOf="@+id/name_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="@+id/guideline3" /> <EditText android:id="@+id/age_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="number" app:layout_constraintBaseline_toBaselineOf="@+id/age_text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="@+id/guideline3" /> <Button android:id="@+id/query_user_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询用户" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/add_user_button" app:layout_constraintVertical_bias="0.021" /> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.04" app:layout_constraintTop_toBottomOf="@+id/query_user_button"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/users_text" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </ScrollView> </androidx.constraintlayout.widget.ConstraintLayout>
- 代码
@Entity data class User( @PrimaryKey(autoGenerate = true) val uid: Int?, @ColumnInfo(name = "user_name") val name: String, val age: Int, val salary: Float )
@Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") fun loadAllByIds(userIds: IntArray): List<User> @Query("SELECT * FROM user WHERE user_name LIKE :name LIMIT 1") fun findByName(name: String): User @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) }
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
class MainActivity : AppCompatActivity() { private lateinit var database: AppDatabase private lateinit var userDao: UserDao override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.add_user_button).setOnClickListener(::addUser) findViewById<Button>(R.id.query_user_button).setOnClickListener(::queryUser) database = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "mydb.sqlite").build() userDao = database.userDao() } fun addUser(view: View) { val name = findViewById<EditText>(R.id.name_edit).text.toString() val age = findViewById<EditText>(R.id.age_edit).text.toString().toInt() val salary = findViewById<EditText>(R.id.salary_edit).text.toString().toFloat() thread { userDao.insertAll(User(null, name, age, salary)) } } fun queryUser(view: View) { thread { val users = userDao.getAll() val sb = StringBuilder() users.forEach { sb.append(it).append('\n') } runOnUiThread { findViewById<TextView>(R.id.users_text).text = sb } } } override fun onDestroy() { super.onDestroy() database.close() } }