When the app is ran, no errors occur however, the databases folder in device file explorer is empty. I have tried to fix the issue myself but since I'm new to android studio and kotlin I haven't been able to I just want to ensure the database is working before I carry on with the rest of the code.
任何帮助都将不胜感激.
Code:
全部的
package com.example.todoit.data
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "todo_data")
data class 全部的 (
@PrimaryKey val id: Int,
val title: String,
var isChecked: Boolean = false
)
全部的Dao
package com.example.todoit.data
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
@Dao
interface 全部的Dao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun add全部的(todo: 全部的)
@Query("SELECT * FROM todo_data ORDER BY id ASC")
fun readAllData(): LiveData<List<全部的>>
}
全部的DataBase
package com.example.todoit.data
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = [全部的::class],version = 1, exportSchema = false)
abstract class 全部的DataBase: RoomDatabase() {
abstract fun todoDao(): 全部的Dao
companion object{
@Volatile
private var INSTANCE: 全部的DataBase? = null
fun getDataBase(context: Context):全部的DataBase{
val tempInstance = INSTANCE
if(tempInstance != null){
return tempInstance
}
synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
全部的DataBase::class.java,
"todo_database"
).build()
INSTANCE = instance
return instance
}
}
}
}
全部的Repository
package com.example.todoit.data
import androidx.lifecycle.LiveData
class 全部的Repository(private val todoDao:全部的Dao) {
val readAllData: LiveData<List<全部的>> = todoDao.readAllData()
suspend fun add全部的(todo:全部的) {
todoDao.add全部的(todo)
}
}
全部的ViewModel
package com.example.todoit.data
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class 全部的ViewModel(application: Application) : AndroidViewModel(application) {
private val readAllData: LiveData<List<全部的>>
private val repository: 全部的Repository
init {
val todoDao = 全部的DataBase.getDataBase(application).todoDao()
repository = 全部的Repository(todoDao)
readAllData = repository.readAllData
}
fun add全部的ToDataBase(todo: 全部的) {
viewModelScope.launch(Dispatchers.IO) {
repository.add全部的(todo)
}
}
}
主要活动
package com.example.todoit
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.todoit.data.全部的
import com.example.todoit.data.全部的ViewModel
import kotlinx.android.synthetic.main.activity_main.*
class 主要活动 : AppCompatActivity() {
private lateinit var todoAdapter: 全部的Adapter
private lateinit var todoViewModel: 全部的ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
todoViewModel = ViewModelProvider(this).get(全部的ViewModel::class.java)
todoAdapter = 全部的Adapter(mutableListOf())
rv全部的Items.layoutManager = LinearLayoutManager(this)
rv全部的Items.adapter = todoAdapter
btnAdd全部的.setOnClickListener {
val todoTitle = et全部的Title.text.toString()
if (todoTitle.isNotEmpty()) {
val todo = 全部的(0,todoTitle,false)
et全部的Title.text.clear()
insertDataToDataBase(todo)
todoAdapter.add全部的(todo)
}
btnDelete全部的.setOnClickListener {
todoAdapter.deleteDone全部的s()
}
}}
private fun insertDataToDataBase(todo: 全部的) {
val todoTitle = et全部的Title.text.toString()
if(todoTitle.isNotEmpty()) {
//Add data to database
todoViewModel.add全部的ToDataBase(todo)
}
}
}
全部的Adapter
package com.example.todoit
import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.todoit.data.全部的
import kotlinx.android.synthetic.main.item_todo.view.*
class 全部的Adapter(
private val todos: MutableList<全部的>,
) : RecyclerView.Adapter<全部的Adapter.全部的ViewHolder>() {
class 全部的ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 全部的ViewHolder {
return 全部的ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_todo,
parent,
false
)
)
}
fun add全部的(todo: 全部的) {
todos.add(todo)
notifyItemInserted(todos.size - 1)
}
fun deleteDone全部的s() {
todos.removeAll { todo ->
todo.isChecked
}
notifyDataSetChanged()
}
private fun toggleStrikeThrough(tv全部的Title: TextView, isChecked: Boolean) {
if (isChecked) {
tv全部的Title.paintFlags = tv全部的Title.paintFlags or STRIKE_THRU_TEXT_FLAG
} else {
tv全部的Title.paintFlags = tv全部的Title.paintFlags and STRIKE_THRU_TEXT_FLAG.inv()
}
}
override fun onBindViewHolder(holder: 全部的ViewHolder, position: Int) {
val cur全部的 = todos[position]
holder.itemView.apply {
tv全部的Title.text = cur全部的.title
cbDone.isChecked = cur全部的.isChecked
toggleStrikeThrough(tv全部的Title, cur全部的.isChecked)
cbDone.setOnCheckedChangeListener { _, isChecked ->
toggleStrikeThrough(tv全部的Title, isChecked)
cur全部的.isChecked = !cur全部的.isChecked
}
}
}
override fun getItemCount(): Int {
return todos.size
}
}
Gradle(模块)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id "kotlin-android-extensions"
}
apply plugin: 'kotlin-kapt'
android {
compileSdk 32
defaultConfig {
applicationId "com.example.todoit"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
//ROOM
def roomVersion = "2.4.2"
implementation "androidx.room:room-ktx:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
// Navigation Component
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.2'
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// Lifecycle components
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
// Kotlin components
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5"
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5"
}
Gradle(项目)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.0' apply false
id 'com.android.library' version '7.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}