2017-11-26 2 views
0

Ich muss eine Konsole-Interface-Anwendung als Todo-Liste in Scala erstellen. Ich habe bereits Datenzugriffsschicht erstellt, wo ich Objekte meiner Datenbank und Abfragen über sie durch Slick 3 habe. Ich versuche auch, eine einfache Schnittstelle zu erstellen, die StdIn für das Lesen von Eingabe in Scala verwendet. Hier ist mein Code für die Schnittstelle:Stateful Benutzer in der Konsole Anwendung 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() 
     } 

Das Problem ist, dass ich in das System als Benutzer und dann ausgegeben eingeben müssen, erstellen, löschen Aufgaben des jeweiligen Benutzers. Also habe ich mich entschieden, die Benutzer-ID als Parameter an alle meine Methoden zur Manipulation zu übergeben. Also habe ich versucht, dies mit dieser Schnittstelle zu tun, aber ich bekomme einen Laufzeitfehler java.lang.NumberFormatException: For input string: "Vector(1)" Ich weiß, dass, um diesen Fehler zu beheben, ich meine Methoden anders arrangieren kann, aber dann kann ich meine userId nicht übergeben.

Um deutlich zu machen, das ist, wie einer meiner Daten Methoden Zugriffsschicht wie folgt aussieht:

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

So wie kann ich die Interface-Methoden oder die gesamte Logik des Benutzerstatus in diesem Code Erhaltung ändern? Ich wäre dankbar für jede Hilfe!

UPDATE! Code geändert ein wenig (Methoden BuildMenu, DisplayMenu). Außerdem habe ich diese Gehwegmethode in meinem Dao anstelle von getUserId erstellt. So funktioniert die Schnittstelle, aber ich frage mich, wie ich meine getUserId-Methode oder die Art, wie sie aufgerufen werden sollte, um id in Methoden wie displayFinishedTasks zu übergeben, noch ändern kann. Hier ist die Methode walkaway:

def selectUserId(login: String) = login match { 
     case "data" => 1 
     case "root" => 2 
    } 
+0

hi @Cassie, haben Sie erwogen, scopt zu verwenden? Es ist verfügbar [hier] (https://github.com/scopt/scopt) auf GitHub. – P3trur0

+0

@ P3trur0 Ich habe es gesehen, aber nicht herausgefunden, wie man es in meinem Projekt verwendet. Danke für den Hinweis – Cassie

+0

1. Sie müssen wahrscheinlich den 'readInt'-Code anzeigen, da das wo die Ausnahme herkommt? Kannst du auch mehr von der Stack-Spur geben? 2.Da Sie einen Fehler bei "Vector (1)" erhalten, sieht es so aus, als würden Sie versuchen, "Vector (1)" (das ist der 'toString' eines' Vector') statt "1" 'zu analysieren (Dies ist die Zeichenfolge einer Ganzzahl). –

Antwort

1

In einem Kommentar über den Sie erwähnen, dass die folgende Zeile ausfällt:

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

die Ausnahme ausgelöst wird:

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

Diese schlägt vor, dass DAO.getUserId eine Vector anstelle einer Int zurückgibt. Schauen Sie sich den Code für diese Methode an:

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

Wir können sehen, dass diese Methode keinen bestimmten Rückgabetyp hat. Wahrscheinlich ist der Rückgabetyp Future[Seq[Int]]. Da Sie nur ein Ergebnis wollen, sollten Sie dies zu einem Future[Int] von head Aufruf ändern:

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) 

Hier vorausgesetzt, ich bin, dass idUser ist bereits ein Long. Wenn es nicht ist, dann müssen Sie eine .toLong einschließen - aber dieses Mal sollte es funktionieren!

+0

Vielen Dank. Es hat mir wirklich geholfen! – Cassie

0

Der obige Code ist ziemlich verkorkste, können wir eine Github Link oder ein weiteres Update erhalten? Ich werde nicht einmal formatieren, wenn ich es in IntelliJ werfe.

und es scheint unfertig Linien zu sein: changeOutputs(checkLogin)=

+0

Sicher, hier ist es https://github.com/CassieAin/todo-list – Cassie

Verwandte Themen