diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1d8c1b2..29d2c40 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ android { defaultConfig { applicationId = "com.example.myapplication" minSdk = 24 - targetSdk = 33 + targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -50,6 +50,7 @@ android { } } + dependencies { implementation("androidx.core:core-ktx:1.9.0") diff --git a/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt b/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt index 737aeda..c982351 100644 --- a/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt +++ b/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt @@ -1,14 +1,13 @@ import android.content.Context -import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.graphics.drawable.BitmapDrawable +import android.util.Log import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.example.myapplication.R -import com.example.myapplication.database.ImageConverter +import com.example.myapplication.database.entities.ImageConverter import com.example.myapplication.database.dao.CardDao import com.example.myapplication.database.dao.UserDao import com.example.myapplication.database.entities.Card @@ -23,36 +22,23 @@ abstract class MobileAppDataBase : RoomDatabase() { abstract fun userDao(): UserDao abstract fun cardDao(): CardDao - companion object{ + companion object { private const val DB_NAME: String = "my-db" @Volatile private var INSTANCE: MobileAppDataBase? = null - suspend fun initialDataBase(appContext: Context){ - INSTANCE?.let { database -> - val userDao = database.userDao() - userDao.insert(User(id = 1, login = "Иван", password = "1234",)) - userDao.insert(User(id = 2, login = "Леонель Месси", password = "4321",)) - - val cardDao = database.cardDao() - cardDao.insert(Card(name = "Феррари Имба", location = "г. Ульяновск", - image = BitmapFactory.decodeResource(appContext.resources, R.drawable.ferrari_laferrari_car2), mileage = 7322, price = 125000, userId = 1) - ) - cardDao.insert(Card(name = "Москоувич", location = "г. Москва", - image = BitmapFactory.decodeResource(appContext.resources, R.drawable.moscowich_car3), mileage = 156771, price = 1000, userId = 1) - ) - } - } - fun getInstance(appContext: Context): MobileAppDataBase { return INSTANCE ?: synchronized(this) { - Room.databaseBuilder( + INSTANCE?.let { return@let it } // Возвращаем INSTANCE, если он уже был создан + + val instance = Room.databaseBuilder( appContext, MobileAppDataBase::class.java, DB_NAME ) - .addCallback(object : Callback() { + .fallbackToDestructiveMigration() + .addCallback(object : RoomDatabase.Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) CoroutineScope(Dispatchers.IO).launch { @@ -60,10 +46,49 @@ abstract class MobileAppDataBase : RoomDatabase() { } } }) - .fallbackToDestructiveMigration() + .also { INSTANCE = it.build() } // Сохраняем INSTANCE .build() - .also { INSTANCE = it } + + Log.d("Database", "Database instance created") + + instance // Возвращаем созданный instance + } + } + + private suspend fun initialDataBase(appContext: Context) { + INSTANCE?.let { database -> + val userDao = database.userDao() + userDao.insert(User(id = 1, login = "Иван", password = "1234",)) + userDao.insert(User(id = 2, login = "Леонель Месси", password = "4321",)) + + val cardDao = database.cardDao() + cardDao.insert( + Card( + name = "Феррари Имба", + location = "г. Ульяновск", + image = BitmapFactory.decodeResource( + appContext.resources, + R.drawable.ferrari_laferrari_car2 + ), + mileage = 7322, + price = 125000, + userId = 1 + ) + ) + cardDao.insert( + Card( + name = "Москоувич", + location = "г. Москва", + image = BitmapFactory.decodeResource( + appContext.resources, + R.drawable.moscowich_car3 + ), + mileage = 156771, + price = 1000, + userId = 1 + ) + ) } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/myapplication/database/entities/Card.kt b/app/src/main/java/com/example/myapplication/database/entities/Card.kt index d66ba95..25ab67b 100644 --- a/app/src/main/java/com/example/myapplication/database/entities/Card.kt +++ b/app/src/main/java/com/example/myapplication/database/entities/Card.kt @@ -5,8 +5,6 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey -import androidx.room.TypeConverters -import com.example.myapplication.database.ImageConverter @Entity( tableName = "cards", diff --git a/app/src/main/java/com/example/myapplication/database/ImageConverter.kt b/app/src/main/java/com/example/myapplication/database/entities/ImageConverter.kt similarity index 91% rename from app/src/main/java/com/example/myapplication/database/ImageConverter.kt rename to app/src/main/java/com/example/myapplication/database/entities/ImageConverter.kt index 6a498ec..f8f6f3e 100644 --- a/app/src/main/java/com/example/myapplication/database/ImageConverter.kt +++ b/app/src/main/java/com/example/myapplication/database/entities/ImageConverter.kt @@ -1,4 +1,4 @@ -package com.example.myapplication.database +package com.example.myapplication.database.entities import android.graphics.Bitmap import android.graphics.BitmapFactory diff --git a/app/src/main/java/com/example/myapplication/screens/authorization.kt b/app/src/main/java/com/example/myapplication/screens/authorization.kt index 3791806..aab6223 100644 --- a/app/src/main/java/com/example/myapplication/screens/authorization.kt +++ b/app/src/main/java/com/example/myapplication/screens/authorization.kt @@ -1,5 +1,6 @@ package com.example.myapplication.screens +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -42,9 +43,14 @@ fun Authorization(navController: NavHostController){ LaunchedEffect(Unit) { withContext(Dispatchers.IO) { - MobileAppDataBase.getInstance(context).userDao().getAll().collect { data -> - users.clear() - users.addAll(data) + try { + val database = MobileAppDataBase.getInstance(context.applicationContext) + database.userDao().getAll().collect { data -> + users.clear() + users.addAll(data) + } + } catch (e: Exception) { + Log.e("DatabaseError", "Error accessing database", e) } } } diff --git a/app/src/main/java/com/example/myapplication/screens/mainScreen.kt b/app/src/main/java/com/example/myapplication/screens/mainScreen.kt index 3610497..cee6796 100644 --- a/app/src/main/java/com/example/myapplication/screens/mainScreen.kt +++ b/app/src/main/java/com/example/myapplication/screens/mainScreen.kt @@ -1,5 +1,6 @@ package com.example.myapplication.screens +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -25,8 +26,10 @@ import com.example.myapplication.database.entities.Card import com.example.myapplication.ui.theme.SkyBlue import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -40,11 +43,14 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Text +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.mutableStateListOf import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.sp import com.example.myapplication.R +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @Composable @@ -54,80 +60,39 @@ fun MainScreen(navController: NavHostController) { LaunchedEffect(Unit) { withContext(Dispatchers.IO) { - MobileAppDataBase.getInstance(context).cardDao().getAll().collect { data -> - cards.clear() - cards.addAll(data) - } - } - } - - Column( - modifier = Modifier - .fillMaxSize() - .background(Color.White) - ) { - DataListScroll(navController, cards) - } - - Column( - modifier = Modifier - .fillMaxSize() - .background(SkyBlue), - verticalArrangement = Arrangement.Center - ) { - navBar(navController = navController) - } -} - -/*@Composable -private fun ListItem( - card: Card, - navController: NavHostController -) { - val bitmap = remember(card) { - BitmapFactory.decodeByteArray(card.image, 0, card.image.size) - } - - val imageBitmap = remember(bitmap) { - bitmap.asImageBitmap() - } - - Card( - modifier = Modifier - .fillMaxWidth() - .padding(10.dp) - .border(2.dp, Color.Gray, RoundedCornerShape(15.dp)), - shape = RoundedCornerShape(15.dp), - elevation = CardDefaults.cardElevation(defaultElevation = 5.dp), - ) { - Box { - Row(verticalAlignment = Alignment.CenterVertically) { - Image( - painter = remember { - BitmapPainter(imageBitmap) - }, - contentDescription = "image", - contentScale = ContentScale.Crop, - modifier = Modifier.size(128.dp) - ) - Column( - modifier = Modifier.padding(5.dp) - ) { - Text(text = card.name, fontWeight = FontWeight.Bold) - Text(text = "Пробег: ${card.mileage}") - Text(text = "Расположение: ${card.location}") - Text(text = "Цена: ${card.price}") - Button(onClick = { navController.navigate("editCard") }) { - Text("Изменить") - } - Button(onClick = { }) { - Text("Удалить") - } + try { + val database = MobileAppDataBase.getInstance(context.applicationContext) + database.cardDao().getAll().collect { data -> + cards.clear() + cards.addAll(data) } + } catch (e: Exception) { + Log.e("DatabaseError", "Error accessing database", e) } } } -}*/ + + + Box() { + Column( + modifier = Modifier + .fillMaxSize() + .background(Color.White) + .fillMaxHeight(0.9f) + ) { + DataListScroll(navController, cards) + } + } + Column( + modifier = Modifier + .fillMaxSize() + .background(SkyBlue) + .fillMaxHeight(0.1f), + verticalArrangement = Arrangement.Center + ) { + navBar(navController = navController) + } +} @Composable fun DataListScroll(navController: NavHostController, dataList: List){