Scalaでtodo-listとしてコンソールインターフェイスアプリケーションを作成する必要があります。私はすでにデータベースのオブジェクトを持っていて、Slick 3を使ってクエリを実行しているデータアクセスレイヤーを作成しました。また、Scalaの入力を読み込むためにStdInを使用して簡単なインターフェイスを作成しようとしています。ここ は、インタフェースのための私のコードです:コンソールアプリケーションのステートフルユーザーScala
object Main {
val db = Database.forConfig("scalaxdb")
val userRepository = new UserRepository(db)
val taskRepository = new TaskRepository(db)
def main(args: Array[String]): Unit = {
println("Main menu:" + " \n1 - Login" + "\n2 - Exit")
println("\nChoose the operation you want to perform:")
val inputMainMenu = readInt()
buildMainMenu(inputMainMenu)
}
def buildMainMenu(inputNumber: Int) = inputNumber match {
case 1 => enterSystem()
case 2 => System.exit(0)
case _ => println("Your input was wrong. Try again"); System.exit(0)
}
def enterSystem(): Unit ={
println("Input you login, please:")
val inputLogin = readLine()
println("Input you password, please:")
val inputPassword = readLine()
val checkLogin = Await.result(DAO.checkUserLogin(inputLogin, inputPassword), Duration.Inf).toString
val userId = DAO.selectUserId(inputLogin)
def changeOutputs(checkLogin: String):Unit = checkLogin match {
case "true" => println("You have successfully entered");
displayMenu(); buildMenu(userId)
case "false" => println("Your input for login or password is
wrong"); System.exit(1)
case _ => println("Your input is wrong"); System.exit(1)
}
changeOutputs(checkLogin)
}
def displayMenu(): Unit ={
println("TODO List:" + "\n1 - Display tasks" + "\n2 - Display finished tasks" + "\n3 - Display unfinished tasks"
+ "\n4 - Add task" + "\n5 - Delete task" + "\n6 - Mark task as finished")
println("\nChoose the operation you want to perform:")
}
val inputNum = readInt()
inputNum
}
def displayUnfinishedTasks(id: Long) = {
println()
println("User's unfinished tasks:\n" + Await.result(DAO.selectUnfinishedTasks(id), Duration.Inf).toList.toString)
displayMenu()
}
問題は、私はユーザーとしてシステムに入力し、出力、作成、特定のユーザーのタスクを削除する必要があるということです。ここで私はすべての自分のメソッドを操作するためのパラメータとしてユーザーIDを渡すことにしました。だから私はこのインタフェースでこれをしようとしましたが、ランタイムエラーが発生しましたjava.lang.NumberFormatException: For input string: "Vector(1)"
私はこのエラーを修正するために、私のメソッドを別の方法で手配することができますが、その後私はuserIdを渡すことができません。それでは、どのよう私はインターフェイスのメソッドまたはこのコードで保存し、ユーザー状態の全体的なロジックを変更することができます
def getUserId(login: String) = {
val queryToGetUserId = (for {
user <- UserTable.table if user.login === login
} yield (user.idUser))
db.run(queryToGetUserId.result)
}
:
それを明確にするために、それは私のデータアクセス層のいずれかの方法がどのように見えるかですか?私はどんな助けにも感謝しています!
UPDATE! コードが少し変更されました(メソッドbuildMenu、displayMenu)。また、私はgetUserIdの代わりに私のdaoでこの歩道のメソッドを作成しました。だからインターフェイスが動作しますが、私はまだ私のgetUserIdメソッドや、displayFinishedTasksのようなメソッドにidを渡すために呼び出されるべき方法を変更することができますか?ここで 離席方法である:
def selectUserId(login: String) = login match {
case "data" => 1
case "root" => 2
}
こんにちは@キャッシー、あなたはscoptの使用を検討しましたか? GitHubでは[こちら](https://github.com/scopt/scopt)が利用可能です。 – P3trur0
@ P3trur0私はそれを見ましたが、私のプロジェクトでどのように使用するのか分かりませんでした。助言ありがとう – Cassie
1.例外がどこから来ているのでしょうから、おそらく 'readInt'コードを表示する必要がありますか?実際には、スタックトレースの多くを与えることはできますか? 2。'Vector(1)'にエラーが発生しているので、 '' 1 ''の代わりに' 'Vector(1)' '(' Vector'の 'toString')を解析しようとしているようです(これは整数の文字列形式です)。 –