Conversation
|
|
||
|
|
||
| private fun makeDropQuery(tableName: String) = | ||
| "DROP TABLE $tableName" |
There was a problem hiding this comment.
Существует конструкция DROP IF EXIST
то же самое касается конструкции CREATE TABLE а то можно поймать ошибки) когда кто-то что удалил или например уже создал
| } | ||
| line() | ||
|
|
||
| for (cust in CustomerData().getCustomers()) { |
There was a problem hiding this comment.
чет тут масло маслянное
custQueries.insert(CustomerData().getCustomers())
|
|
||
| dbInit.createTable(producers) | ||
| dbInit.createTable(products) | ||
| line() |
There was a problem hiding this comment.
давай сделаем line с параметром
и туда будем передавать строку
fun line(title: String? = null) = println("\n-----${title ?: "///" }-----\n")
|
|
||
| fun oneToManyTest() { | ||
| val producers = Table("OTM_DB", "Producers", producerArgs, producerArgsMap) | ||
| val products = Table("OTM_DB", "Products", productArgs, productArgsMap) |
There was a problem hiding this comment.
я не совсем понял зачем тебе 2 базы) чисто для наглядности типо решил сделать?
| val conn: Connection = DriverManager.getConnection("jdbc:sqlite:src/main/resources/$databaseName") | ||
| val stm: Statement = conn.createStatement() | ||
|
|
||
| override fun close() { |
|
|
||
| class DBService(private val databaseName: String) : AutoCloseable { | ||
|
|
||
| val conn: Connection = DriverManager.getConnection("jdbc:sqlite:src/main/resources/$databaseName") |
There was a problem hiding this comment.
а давай напишем тут вариацию под разные базы?
ну типо в конструктор еще будем передавать тип базы и возможные параметры к ее подключению?
| prepareAndExecute(dbService, sqlQuery) | ||
| println("Table $tableName dropped") | ||
| } catch (e: SQLiteException) { | ||
| println("Something went wrong while drop table") |
There was a problem hiding this comment.
добавь в ошибку вывод инфы по названию таблицы) как бы в happy path у тебя есть а тут нет)
| } | ||
| } | ||
|
|
||
| fun selectById(id: Int, table: Table = this.mainTable): String? { |
There was a problem hiding this comment.
ну тут конечно ты там по логике намудрил)
некоторые вещи лучше упрощать) пусть даже они что-то дублируют)
| preparedStatement.setInt(1, cost) | ||
| val rs = preparedStatement.executeQuery() | ||
| println("Selected elements with cost less $cost") | ||
| getStringsFromResponse(rs) |
| return if (list.isEmpty()) | ||
| null | ||
| else | ||
| list[0] |
There was a problem hiding this comment.
так низя) если у тебя тут лист а ты хотел 1 значение) низя брать первое
надо ошибку выбрасывать что мы ожидали 1 значение а тут лист.
тебе база не гарантирует что всегда будет отдавать одинаково ответ с какой то сортировкой
|
|
||
| fun selectById(id: Int, table: Table = this.mainTable): String? { | ||
| DBService(databaseName).use { dbService -> | ||
| return try { |
There was a problem hiding this comment.
в середине лямбды не стоит писать return, вот сюда лучше такие вещи помещать
DBService(databaseName).use { dbService ->
| } catch (e: SQLiteException) { | ||
| println("Something went wrong while joining") | ||
| println(e.message) | ||
| emptyList() |
There was a problem hiding this comment.
конструкции с вовзратом из catch выглядят честно говоря ужасно
но есть inline функции в котлине которые позволяют решить эту проблемку вот смотри)
p.s. код взял из другой функции но это не важно) смысл был показать
runCatching {
val sqlQuery = "SELECT * FROM $tableName WHERE ${args[3]} < ?"
val preparedStatement = dbService.conn.prepareStatement(sqlQuery)
preparedStatement.setInt(1, cost)
val rs = preparedStatement.executeQuery()
println("Selected elements with cost less $cost")
getStringsFromResponse(rs)
}.onFailure {
println("Something went wrong while selecting from $tableName")
println(it.message)
}.getOrElse { emptyList() }
| val sb = StringBuilder() | ||
| for (str in argsMap) { | ||
| when (str.value) { | ||
| "TEXT" -> sb.append(rs.getString(str.key)) |
| private fun getStringsFromResponse(rs: ResultSet, argsMap: Map<String, String> = this.argsMap): List<String> { | ||
| val ans = mutableListOf<String>() | ||
| while (rs.next()) { | ||
| val sb = StringBuilder() |
There was a problem hiding this comment.
ты в цикле каждый раз пересоздаешь StringBuilder
давай вынесем его наверх и просто будем в конце цикла очищать
toString тут тебе точно возращает новую строку так что будет все ок
rumBo90
left a comment
There was a problem hiding this comment.
Если честно) очень намудрил))) Но это тоже полезно, потому что это нормальное желание человека сделать хорошо) но тут самое сложное научится видеть эту грань, где надо остановится. Так что в целом все равно молодец но пройтись по комментариям поправь
и давай еще по пакетам разнесем ) чтоб как то структурировать код
| ) { | ||
|
|
||
| fun createAllTables(){ | ||
| for (t in tables)createTable(t) |
| getStringsFromResponse(rs, table.argsMap) | ||
| } catch (e: SQLiteException) { | ||
| val ans = getStringsFromResponse(rs, table.argsMap) | ||
| rs.close() |
| for (el in args.indices) { | ||
| append(args[el]) | ||
| if (el != args.size - 1) | ||
| append(", ") |
There was a problem hiding this comment.
или в 1 строчку или операторные скобки
rumBo90
left a comment
There was a problem hiding this comment.
в целом норм но подправь еще немного
No description provided.