2017-11-26 10 views
0

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 
    } 
+0

こんにちは@キャッシー、あなたはscoptの使用を検討しましたか? GitHubでは[こちら](https://github.com/scopt/scopt)が利用可能です。 – P3trur0

+0

@ P3trur0私はそれを見ましたが、私のプロジェクトでどのように使用するのか分かりませんでした。助言ありがとう – Cassie

+0

1.例外がどこから来ているのでしょうから、おそらく 'readInt'コードを表示する必要がありますか?実際には、スタックトレースの多くを与えることはできますか? 2。'Vector(1)'にエラーが発生しているので、 '' 1 ''の代わりに' 'Vector(1)' '(' Vector'の 'toString')を解析しようとしているようです(これは整数の文字列形式です)。 –

答えて

1

val userId = Await.result(DAO.getUserId(inputLogin), Duration.Inf).toString.toLong 

スローされた例外がある:

java.lang.NumberFormatException: For input string: "Vector(1)" 

これをDAO.getUserIdIntの代わりにVectorを返すことを示唆しています。そのメソッドのコードを見て:

def getUserId(login: String) = { 
    val queryToGetUserId = (for { 
    user <- UserTable.table if user.login === login 
    } yield (user.idUser)) 
    db.run(queryToGetUserId.result) 
} 

このメソッドには、指定された戻り値の型がないことがわかります。ほとんどの場合、返品タイプはFuture[Seq[Int]]です。あなたが1つの結果だけをしたいので、あなたはheadを呼び出すことによってFuture[Int]にこれを変更する必要があります。

def getUserId(login: String): Future[Long] = { 
    val queryToGetUserId = (for { 
    user <- UserTable.table if user.login === login 
    } yield (user.idUser)).head // Will throw exception if empty result 
    db.run(queryToGetUserId.result) 
} 

... 

val userId = Await.result(DAO.getUserId(inputLogin), Duration.Inf) 

は、ここで私はidUserはすでにLongであると仮定しています。そうでない場合は、.toLongを含める必要がありますが、今回はうまくいくはずです。

+0

ありがとうございます。本当に私を助けました! – Cassie

0

上記のコードはかなり台無しにされ、我々はgithubのリンクまたは他のアップデートを入手できますか? 私はそれをIntelliJに投げるときにフォーマットしません。

と未完成の線があるように表示されます。あなたは次の行が失敗していることに言及上のコメントでchangeOutputs(checkLogin)=

+0

もちろん、こちらはhttps://github.com/CassieAin/todo-list – Cassie

関連する問題