Как сделать чтобы 2 столбца username и email были только уникальными и не могли повторятся?
Если вводишь только email новый а username остаётся тот же то user всё равно добавляется. А по идее не должен
класс где добавляется и проверяется user
private fun addUser(
context: Context,
binding: ActivityRegisterBinding
) {
Log.d("RegisterClassDebugger", "Начало выполения метода")
db = Room.databaseBuilder(
context,
MyRoomManager::class.java, "db_sessions"
).fallbackToDestructiveMigration().allowMainThreadQueries().build()
if (isEmpty(binding)) {
Log.d("RegisterClassDebugger", "Начало выполения условия")
val long = db.userDAO().addUser(
user = getUser(binding)
)
if (/*isNotRepeat(binding)*/ long != -1L) {
println(long)
//val userId = getUserDB(getUser(binding)).id!!
/*db.sessionDAO().createSession(
Session(
device_name = deviceFullName,
user_id = getUserDB(getUser(binding)).id!!,
isStatus = StatusSession.Active.name
)
)*/
registerUseCase.execute(
getUser(binding)
)
for (i in db.userDAO().getUsers()) {
println(i)
}
for (i in db.sessionDAO().getSessionAll()) {
println(i)
}
Toast.makeText(context, "Пользователь создан!",
Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "Такой username или email существует",
Toast.LENGTH_SHORT).show()
}
} else {
Log.d("RegisterClassDebugger", "Условие неверно")
Toast.makeText(context, "Не удалось зарегестрировать пользователя!", Toast.LENGTH_SHORT).show()
}
}
private fun getUserDB(
user: User
): User = db.userDAO().getUser(
avatar = user.avatar,
username = user.username,
first_name = user.first_name,
last_name = user.last_name,
surname = user.surname,
password = user.password,
email = user.email,
city = user.city,
date_registration = user.date_registration
)
private fun getUser(
binding: ActivityRegisterBinding
): User = User(
avatar = uri.toString(),
username = binding.username.text.toString(),
first_name = binding.firstName.text.toString(),
last_name = binding.lastName.text.toString(),
surname = binding.surname.text.toString(),
password = binding.password.text.toString(),
email = binding.email.text.toString(),
city = binding.city.text.toString(),
date_registration = getDateTimeUseCase.execute()
)
private fun isNotRepeat(
binding: ActivityRegisterBinding
): Boolean = isUsername(binding) == null && isEmail(binding) == null
private fun isUsername(
binding: ActivityRegisterBinding
): String? = try {
db.userDAO().getUsernameAndEmail(getUser(binding).username, getUser(binding).email).username
} catch (npe: NullPointerException) {
null
}
private fun isEmail(
binding: ActivityRegisterBinding
): String? = try {
db.userDAO().getUsernameAndEmail(getUser(binding).username, getUser(binding).email).email
} catch (npe: NullPointerException) {
null
}
private fun isEmpty(
binding: ActivityRegisterBinding
): Boolean = !binding.username.text?.isEmpty()!! && !binding.firstName.text?.isEmpty()!! &&
!binding.lastName.text?.isEmpty()!! && !binding.surname.text?.isEmpty()!! &&
!binding.password.text?.isEmpty()!! && !binding.city.text?.isEmpty()!! &&
!binding.email.text?.isEmpty()!!
UserDAO
@Dao
interface UserDAO {
@Query("SELECT * FROM users")
fun getUsers(): List<User>
@Query("SELECT * FROM users WHERE id")
fun getUserID(): User
@Query("SELECT * FROM users WHERE id=:id")
fun setUserID(id: Int): User
@Query("SELECT * FROM users WHERE avatar=:avatar AND username=:username AND first_name=:first_name " +
"AND last_name=:last_name AND surname=:surname AND password=:password AND email=:email " +
"AND city=:city AND date_registration=:date_registration")
fun getUser(
avatar: String,
username: String,
first_name: String,
last_name: String,
surname: String,
password: String,
email: String,
city: String,
date_registration: String
): User
@Query("SELECT * FROM users WHERE username=:username AND email=:email")
fun getUsernameAndEmail(
username: String,
email: String,
): User
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun addUser(user: User): Long
@Delete
fun deleteUser(user: User)
}
модель данных user
@Entity(
tableName = "users",
indices = [
Index(
value = ["username", "email"],
unique = true
)
]
)
@Parcelize
data class User(
@PrimaryKey(
autoGenerate = true
) var id: Int? = null,
@ColumnInfo(
name = "avatar"
) val avatar: String,
@ColumnInfo(
name = "username"
) val username: String,
@ColumnInfo(
name = "first_name"
) val first_name: String,
@ColumnInfo(
name = "last_name"
) val last_name: String,
@ColumnInfo(
name = "surname"
) val surname: String,
@ColumnInfo(
name = "email"
) val email: String,
@ColumnInfo(
name = "password"
) val password: String,
@ColumnInfo(
name = "city"
) val city: String,
@ColumnInfo(
name = "date_registration"
) val date_registration: String
): Parcelable