Мне нужна помощь по поводу баз данных комнат.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Мне нужна помощь по поводу баз данных комнат.

Сообщение Anonymous »

Я новичок в Kotlin и сейчас пытаюсь создать небольшое приложение для электронных книг для своего проекта. По сути, у меня есть база данных комнат для книг, принадлежащих всем пользователям, и ViewModel, которая помогает ее заполнить.

Код: Выделить всё

@Entity
data class UsersBook(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
@ColumnInfo val idImage: Int,
@ColumnInfo val title: String,
@ColumnInfo val author: String,
@ColumnInfo val toRead: Boolean,
@ColumnInfo val categories: Category,
@ColumnInfo val favourite: String,
@ColumnInfo val rating: Double
)

Код: Выделить всё

//Helper ViewModel
data class AddNewUserBookState(
val idImage: Int = 0,
val title: String = "",
val author: String = "",
val toRead: Boolean = false,
val categories: Category = Category.Avventura,
val nameOwner: String = "",
val rating: Double = 0.0
) {
fun toUserBook() = UsersBook(
idImage = idImage,
title = title,
author = author,
toRead = toRead,
categories = categories,
nameOwner = nameOwner,
rating = rating
)
}
interface AddNewUserBookActions {
fun setImage(idImage: Int)
fun setTitle(title: String)
fun setAuthor(author: String)
fun setToRead(toRead: Boolean)
fun setCategories(categories: Category)
fun setNameOwner(nameOwner: String)
fun setRating(rating: Double)
}

class AddUsersBooksViewModel : ViewModel() {
private val _state = MutableStateFlow(AddNewUserBookState())
val state = _state.asStateFlow()

val actions = object : AddNewUserBookActions {
override fun setImage(idImage: Int) =
_state.update { it.copy(idImage = idImage) }

override fun setTitle(title: String) =
_state.update { it.copy(title = title) }

override fun setAuthor(author: String) =
_state.update { it.copy(author = author) }

override fun setToRead(toRead: Boolean) =
_state.update { it.copy(toRead = toRead) }

override fun setCategories(categories: Category) =
_state.update { it.copy(categories = categories) }

override fun setNameOwner(nameOwner: String) =
_state.update { it.copy(nameOwner = nameOwner) }

override fun setRating(rating: Double) =
_state.update { it.copy(rating = rating) }

}
}

Код: Выделить всё

//Database
data class UsersBooksState(val usersBooks: List)

class UsersBooksViewModel(private val repository: UsersBooksRepository) : ViewModel() {
val state = repository.books.map { UsersBooksState(usersBooks = it) }.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(),
initialValue = UsersBooksState(emptyList())
)

fun addUserBook(usersBook: UsersBook) = viewModelScope.launch {
repository.upsert(usersBook)
}
}
Это мой экран магазина

Код: Выделить всё

data class Book(
val idImage: Int,
val title: String,
val author: String,
val categories: Category,
val price: Double,
val discount: Int,
val rating: Double
)

@Composable
fun StoreScreen(
state: AddNewUserBookState,
actions: AddNewUserBookActions,
onSubmit: () ->  Unit,
usersState: LoggedUserState
) {

Column(modifier = Modifier.fillMaxSize()) {
val books = remember {
listOf(Book(
R.drawable.idImage,
"title",
"author",
Category,
price,
discount,
rating
))

}
LazyRow(
modifier = Modifier.weight(0.5f),
horizontalArrangement = Arrangement.spacedBy(25.dp),
contentPadding = PaddingValues(7.dp, 0.dp, 3.dp, 0.dp)
) {
items(books) {
if (it.discount == 0) {
StoreLibraryItem(
it,
state,
actions,
onSubmit,
usersState
)
}
}
}
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun StoreLibraryItem(
item: Book,
state: AddNewUserBookState,
actions: AddNewUserBookActions,
onSubmit: () -> Unit,
usersState: LoggedUserState
) {
Column(
modifier = Modifier.width(167.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically
) {

Button(onClick = {
actions.setTitle(item.title)
actions.setAuthor(item.author)
actions.setAuthor(item.title)
actions.setCategories(item.categories)
actions.setToRead(false)
actions.setImage(item.idImage)
actions.setRating(item.rating)
actions.setNameOwner(usersState.username)
onSubmit()
}) {
Text(text = "Buy")
}
Spacer(modifier = Modifier.size(15.dp))
Text(
text = item.price.toString() + "€",
style = MaterialTheme.typography.titleLarge
)
}

}
}

В основном у меня две проблемы:
1) Для книг в магазине я просто использую список, который создаю на экране магазина (не уверен) если это хорошая идея, но мне нужно всего около 20-30 книг). У каждой книги есть кнопка для добавления ее в базу данных UserBooks (с некоторыми дополнительными полями, такими как nameOwner, которое я получаю, используя имя пользователя, вошедшего в систему в данный момент), однако я не уверен, как обрабатывать onClickButton, поскольку я потребуется некоторая задержка или что-то в этом роде.
2) Если я хочу добавить 3-4 книги одновременно, как мне с этим справиться? (например, у каждого пользователя есть несколько «бесплатных» книг, которые ему выдаются после регистрации) у каждого пользователя есть копия книги в базе данных UserBook, главным образом из-за поля «любимое».
Изначально у меня была аналогичная проблема со входом в систему, и кто-то здесь предложил мне использовать оператор When для обработки навигации после проверки имени пользователя и пароля, хотя я мог бы использовать что-то подобное, например, TransactionScreen, но я не уверен, сработает ли это, поскольку я мог бы просто усложнить свой проект бесплатно (также это не решило бы второй вопрос) или, может быть, использовать предварительно заполненную базу данных для книг, но как бы я обработал поле userOwner? поскольку база данных для пользователей находится в памяти (мне также нужно будет узнать, как ее создать).

Подробнее здесь: https://stackoverflow.com/questions/787 ... -databases
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»