ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
1305
1305
EMPFEHLEN
-
13.11.09 17:15 #1
- Registriert seit
- Apr 2007
- Beiträge
- 27
Hallo zusammen
Ich bin dran ein DVD-Ausleihe Programm zu schreiben.
Zu erwähnen ist noch, das dies eine Semesteraufgabe für mein Studium ist und das folgendes Projekt übernommen werden musste, weil jeder in der Klasse von jemandem anders das Programm weiterentwickeln muss.
Jetzt habe ich ein Problem, wenn ich bei Punkt 2 (Film oder Schauspieler hinzufügen)einen Film der Datenbank hinzufügen möchte, kann ich zwar problemlos die verschiednene Parameter angeben (Filmname, Beschreibung usw.) doch nach Eingabe der Jahreszahl, nach welcher der Film der Datenbank hinzugefügt werden muss, bekomme ich folgende Fehlermeldung:
Folgende Java-Klasse verwende ichException in thread "main" java.sql.SQLException: integrity constraint violation: unique constraint or index violation
die Mainklasse:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
import java.io.*; import java.sql.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Mainclass { public static boolean cancel=false; public static String zeile; public static BufferedReader ein = new BufferedReader(new InputStreamReader(System.in)); //main klasse geändert NEU public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException{ startScreen(); } //Aufteilung der Methoden NEU public static void startScreen() throws IOException, SQLException, ClassNotFoundException{ Statement st; ArrayList movies; st=connect(); movies=execute_select(st); //Start screen System.out.println("Willkommen. Viel Spass mit der Rainy Day Movie Database!"); System.out.println("Sie haben folgende Möglichkeiten: "); System.out.println("0: Alle Filme anzeigen "); System.out.println("1: Einen Eintrag editieren "); System.out.println("2: Einen Film oder Schauspieler hinzufügen"); System.out.println("3: Einen Film nach Namen oder nach Schauspieler suchen "); System.out.println("4: Die Filme sortieren"); System.out.println("5: Einen Film oder Schauspieler löschen"); System.out.println("9: Programm beenden"); menuAuswahl(movies, st); } //neuerstellte methode NEU public static void menuAuswahl(ArrayList movies, Statement st) throws IOException, SQLException, ClassNotFoundException { String menuRegex = "[0-9]"; boolean menuInput = false; // ÄNDERUNG Die Eingabe im Hauptmenu wird geprüft ob sie wirklich den vorhanden Optionen (0,1,2,3,4,5,9) entspricht NEU while (menuInput== false) { System.out.println("Wählen Sie die entsprechende Zahl"); System.out.print("--> "); String menuOption = new Scanner(System.in).nextLine(); Pattern p4 = Pattern.compile(menuRegex); Matcher m4 = p4.matcher(menuOption); menuInput = m4.matches(); char c2 = menuOption.length() == 0 ? ' ' : menuOption.toUpperCase().charAt(0); if (menuInput == false){ System.out.println("Falsche Eingabe bitte nur eine einstellige zahl"); } // Option 0 NEU else if (menuOption.equals("0")){ System.out.println("Alle diese Filme befinden sich in unserer Datenbank:\n"); show(movies); //Methode show aufrufen System.out.println("Möchten Sie nun tun?"); System.out.println("A = Zurück zum Hauptmenu"); System.out.println("B = Programm beenden"); //Verschachtelung der Optionen die man nach der Auflistung aller Filme bekommt NEU String subMenuOption = new Scanner(System.in).nextLine(); char c1 = subMenuOption.length() == 0 ? ' ' : subMenuOption.toUpperCase().charAt(0); System.out.println("Möchten Sie nun tun?"); System.out.println("A = Zurück zum Hauptmenu"); System.out.println("B = Programm beenden"); switch(c1) { case 'A': startScreen(); break; case 'B': System.out.println("Auf Wiedersehen!"); cancel=true; break; } } // Option 1 NEU else if(menuOption.equals("1")){ System.out.println("noch nicht realisiert!!"); } // Option 2 NEU else if(menuOption.equals("2")){ System.out.println("Möchten Sie einen Schauspieler oder einen Film hinzufügen?"); System.out.println("1 Film 2 Schauspieler"); String s3 = new Scanner(System.in).nextLine(); char c3 = s3.length() == 0 ? ' ' : s3.toUpperCase().charAt(0); switch(c3) { case '1': insertMovie(movies, st); break; case '2': insertActor(movies, st); break; default: } } // Option 3 NEU else if(menuOption.equals("3")){ System.out.println("Nach was wollen sie suchen?"); System.out.println("1 Schauspieler 2 Name"); zeile = ein.readLine(); // Schauen ob nsch Schauspieler oder Name gesucht werden soll und je nach eingabe search methode anders aufrufen if (zeile.equals("2")){ System.out.println("Wie heist der Film?"); zeile = ein.readLine(); search(movies,(String)zeile,1); }else if (zeile.equals("1")){ System.out.println("Welchen Schauspieler möchten sie?"); zeile = ein.readLine(); search(movies,zeile,2); } else System.out.println("ungültige eingabe"); } // Option 4 NEU else if(menuOption.equals("4")){ System.out.println("noch nicht realisiert!!"); } // Option 5 NEU else if(menuOption.equals("5")){ System.out.println("noch nicht realisiert!!"); } // Option 9 NEU else if(menuOption.equals("9")){ System.out.println("Auf Wiedersehen!"); System.exit(0); } } } public static void insertMovie(ArrayList movies, Statement st)throws SQLException, IOException, ClassNotFoundException { Scanner inp = new Scanner(System.in); String fname; String fdescription; int rating1=0; int year1=0; int id=0; int aid=0; String rID =""; String ratingRegex = "[0-9]"; String yearRegex = "[0-9]{4}"; String actorRegex = "[0-9]"; String yID = ""; String aID = ""; System.out.println("Geben Sie den Namen des Films an:"); fname=inp.next(); System.out.println("Geben Sie eine Beschreibung des Films ein:"); fdescription=inp.next(); // ÄNDERUNG, es können nun nur noch zahlen eingetippt werden NEU boolean rating = false; while(rating == false) { System.out.println("Geben Sie eine Bewertung des Films ein( 1-10 ):"); System.out.print("---> "); rID = new Scanner(System.in).nextLine(); Pattern p = Pattern.compile(ratingRegex); Matcher m = p.matcher(rID); rating = m.matches(); if(rating == false){ System.out.println("Die Eingabe war Falsch"); } } // ÄNDERUNG es können nur noch 4 zahlen eingetippt werden NEU boolean year = false; while(year == false){ System.out.println("Geben Sie ein wann der Film erstellt wurde:"); System.out.print("---> "); yID = new Scanner(System.in).nextLine(); Pattern p1 = Pattern.compile(yearRegex); Matcher m1 = p1.matcher(yID); year = m1.matches(); if(year == false){ System.out.println("Die Eingabe war Falsch"); } } id= movies.size()+1; //film einfügen st.executeUpdate("INSERT INTO MOVIE VALUES ("+ id +", '"+ fname +"', '"+ fdescription + "'," + rID + ", " + yID +")"); //ÄNDERUNGEN Die ID ist muss eine 3-stellige zahl sein NEU boolean actor = false; while(actor == false){ System.out.println("Geben sie die ID eines Schauspielers an:"); System.out.print("---> "); aID = new Scanner(System.in).nextLine(); Pattern p2 = Pattern.compile(actorRegex); Matcher m2 = p2.matcher(aID); actor = m2.matches(); if(actor == false){ System.out.println("Die Eingabe war Falsch"); } } st.executeUpdate("INSERT INTO MOVIE_ACTOR VALUES ("+ id +","+aID+" )"); //mit tabelle schauspieler verbinden // ÄNDERUNG Die folgende nachricht erscheint und das program kehrt zum startbildschirm zurück NEU System.out.println("Der Film wurde ins Archiv aufgenommen" + "\n"); startScreen(); } public static void insertActor(ArrayList movies, Statement st)throws SQLException { Scanner inp = new Scanner(System.in); ResultSet rs; String fname; String fdescription; int rating=0; int year=0; int id=0; int aid=0; String aname; String aprename; rs= st.executeQuery("SET Schema RDMDB; SELECT * FROM Actor"); //zählen wie viele einträge while (rs.next())aid=aid+1; System.out.println("Vorname Schauspieler eingeben"); aprename= inp.next(); System.out.println("Nachname Schauspieler eingeben"); aname=inp.next(); aid=aid+1; st.executeUpdate("INSERT INTO ACTOR VALUES ("+aid+", '"+aname+"', '"+aprename+"')"); //einfügen schauspieler System.out.println("Geben sie die ID eines Filmes an wo er Mitspielt:"); id=inp.nextInt(); st.executeUpdate("SET Schema RDMDB; INSERT INTO MOVIE_ACTOR VALUES ("+ id +","+aid+" )"); //einfügen film wo er mitgemacht hat. } public static Statement connect() throws ClassNotFoundException, SQLException{ // Diese Methode stellt die Verbindung zur datenbank her Class.forName("org.hsqldb.jdbcDriver"); //hsqldb treiber laden // Pfad zur datenbank angeben Achtung ändert sich auf jedem Computer, muss angepasst werden Connection con = DriverManager.getConnection("jdbc:hsqldb:file:C:\\Users\\kiran\\programme\\programmieren\\" + "hsqldb\\data\\rainydays\\rainydays2"); //SQL Select Statement Kreiren Statement st = con.createStatement(); return st; } //Methode liest alle einträge aus db aus und speichert sie in einer array list public static ArrayList execute_select(Statement st) throws SQLException{ int anz=0; int id=0; int idlast=1; String name=""; String description=""; int rating=0; int year=0; ArrayList movies= new ArrayList(); //arraylist movies erstellen ArrayList actors= new ArrayList(); //SQL befehl ausführen ResultSet rs = st.executeQuery("SELECT Movie.movie_id, Movie.movie_name, Movie.movie_description," + " Movie.movie_rating, Movie.movie_year, Actor.actor_prename, Actor.actor_name FROM Movie, " + "Actor, movie_actor WHERE Movie.movie_id = movie_actor.movie_id AND Actor.actor_id= movie_actor.actor_id ;"); // arraylist füllen while (rs.next()) { id=rs.getInt(1); if (id==idlast) //prüfen ob immer noch der gleiche film, wenn ja nur schauspieler hinzufügen, wenn nein Film. actors.add(new Actor (rs.getString(6) +" "+ rs.getString(7))); else { movies.add(new Movie(idlast,name,description ,rating , year,actors)); actors.clear(); actors.add(new Actor (rs.getString(6) +" "+ rs.getString(7))); } idlast=id; name=rs.getString(2); description=rs.getString(3); rating=rs.getInt(4); year=rs.getInt(5); if(rs.isLast())movies.add(new Movie(idlast,name,description ,rating , year,actors)); //wenn letzter eintrag film hinzufügen } anz=anz+1; return movies; } //Methode zeigt alle filme auf Bildschirm an public static void show(ArrayList movies) { int anz=movies.size(); // bis ans ende der arraylist jeden film ausgeben for (int i=0; i<anz;i++) { Movie k=(Movie) movies.get(i); k.print(); System.out.println("\n************************************************"); } } //Methode sucht nach filname oder Schauspielern die Mitgemacht haben. public static void search(ArrayList movies, String name, int typ){ int anz=movies.size(); boolean found =false; ArrayList actors=new ArrayList(); int actor_nr=0; //wenn suchen nach name if (typ==1){ for (int i=0; i<anz;i++) { //list durchgehen bis gefunden wenn gefunden true sonst bleibt false Movie k=(Movie) movies.get(i); if (k.movie_name.equals(name)) { System.out.println("\n************************************************"); k.print(); System.out.println("\n************************************************"); found =true; break; } } } else { //sonst for (int i=0; i<anz;i++) { //alle filme durchgehen Movie k=(Movie) movies.get(i); actors=k.movie_actor; actor_nr=actors.size(); for (int j=0; j<actor_nr;j++) { //die schauspiler des films durchgehen wennn gesuchter dabei film ausgebe. Actor l=(Actor) actors.get(j); if (l.actor_name.equals(name)) { System.out.println("\n************************************************"); k.print(); System.out.println("\n************************************************"); found =true; } } } } if (found==false) System.out.println("kein eintrag gefunden"); //wenn nichts gefunden diese meldung } //Methode fügt filme und schauspileer der DB hinzu }
Actor-Klasse:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
^public class Actor { //Klasse autor Speichert die Autoren als objekt String actor_name; public Actor(String name){ actor_name=name; } // geändert NEU public void print(){ //Methode druckt den Autor aus System.out.println(actor_name); } }
Movie-Klasse
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import java.util.*; public class Movie { // Speichert die Filme als Objekt int movie_id; String movie_name; String movie_description; int movie_rating; int movie_year; ArrayList movie_actor; //Actor movie_actor; public Movie(int id, String name, String description, int rating, int year, ArrayList actor) { //Konstruktor für objekt //public Movie(int id, String name, String description, int rating, int year, Actor actor) { movie_id=id; movie_name=name; movie_description=description; movie_rating=rating; movie_year=year; movie_actor=(ArrayList) actor.clone(); } public void print(){ //Gibt wertr des Objekts aus. //änderungen vorgenommen, Anzeige der Film auflistung NEU System.out.println("MovieID: " + movie_id); System.out.println("Movie: " + movie_name); System.out.println("Description: " + movie_description); System.out.println("Rating: " + movie_rating); System.out.println("Year: " + movie_year); int anz= movie_actor.size(); for (int i=0; anz>i;i++) { Actor k=(Actor) movie_actor.get(i); // andere ausgabe NEU System.out.print("Actor: "); k.print(); } } /*public static Movie view(){ return null; }*/ }
Hier noch die Datenbank informationen:
Create-Statements:
CREATE TABLE MOVIE (movie_ID INT PRIMARY KEY,
movie_name CHAR(30),
movie_description CHAR(30),
movie_rating INT,
movie_year INT
);
CREATE TABLE ACTOR (actor_ID INT PRIMARY KEY,
actor_name CHAR(30),
actor_prename CHAR(30)
);
CREATE TABLE MOVIE_ACTOR (movie_ID INT NOT NULL,
actor_ID INT NOT NULL,
FOREIGN KEY (movie_ID) REFERENCES MOVIE (movie_ID) ,
FOREIGN KEY (actor_ID) REFERENCES ACTOR (actor_ID)
)
Insert-Statements:
INSERT INTO MOVIE VALUES (1, 'TEST', 'TEST', 2, 1988)
INSERT INTO MOVIE VALUES (2, 'American Gangster', 'gangster movie', 5, 2008)
INSERT INTO MOVIE VALUES (3, 'The departed', 'mafia movie', 1, 2011)
INSERT INTO MOVIE VALUES (4, '2012', 'catastrophe movie', 5, 2012)
INSERT INTO MOVIE VALUES (5, 'Snakes on a plane', 's.jackson will play in it', 4, 2007)
INSERT INTO MOVIE VALUES (6, 'nemo', 'fish movie', 2, 2006)
INSERT INTO MOVIE VALUES (7, 'american pie 3', 'teenie movie', 1, 2005)
INSERT INTO ACTOR VALUES (1, 'Muster', 'Max')
INSERT INTO ACTOR VALUES (2, 'Washington', 'Denzel')
INSERT INTO ACTOR VALUES (3, 'Damon', 'Matt')
INSERT INTO ACTOR VALUES (4, 'DiCaprio', 'Leonardo')
INSERT INTO ACTOR VALUES (5, 'noActor', 'noActor')
INSERT INTO ACTOR VALUES (6, 'animation', 'animation')
INSERT INTO ACTOR VALUES (7, 'Jackson', 'Samuel L.')
INSERT INTO MOVIE_ACTOR VALUES (1, 1)
INSERT INTO MOVIE_ACTOR VALUES (2, 2)
INSERT INTO MOVIE_ACTOR VALUES (3, 3)
INSERT INTO MOVIE_ACTOR VALUES (3, 4)
INSERT INTO MOVIE_ACTOR VALUES (4, 5)
INSERT INTO MOVIE_ACTOR VALUES (5, 7)
INSERT INTO MOVIE_ACTOR VALUES (6, 6)
INSERT INTO MOVIE_ACTOR VALUES (7, 5)
-
1. Du verwendest für die Film-ID movies.length+1.
Wenn du einen Film zwischendrin löschst, z.B. Film 2 von 8, wird die Id 8 beim nächsten Eintrag ein zweites Mal vergeben. Um das zu umgehen könntest du z.B. AutoIncrements in der Datenbank verwenden oder per Zufallszahlengenerator eine ID ausürfeln; wenn du dann wieder diese Exception hast, kannst du im catch-Zweig einen neuen Versuch mit einer neuen ID starten.
2. Dein Programm ruft startScreen() auf
, startScreen() ruft menuAuswahl() auf
, menuAuswahl() ruft insertMovie() auf
, insertMovie() ruft startScreen() auf => unendliche Schachtelungstiefe.
insertActor() macht den Fehler nicht.
Mache aus startScreen() eine reine Anzeigefunktion, die du in einer Eingabeschleife aufrufst z.B.
Code :1 2 3 4 5
do { movies = ... startScreen(); } while ( menuAuswahl(...) != 9 )
Ähnliche Themen
-
check constraint
Von duukta im Forum Relationale DatenbanksystemeAntworten: 7Letzter Beitrag: 16.10.08, 19:19 -
MySQL Integrity Constraint Violation
Von Nambot im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 02.07.08, 16:17 -
Constraint löschen
Von borg- im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 13.11.07, 18:29 -
constraint befehl
Von ZeroGirl im Forum Relationale DatenbanksystemeAntworten: 6Letzter Beitrag: 20.04.06, 10:10 -
Constraint-Problem
Von paulklee im Forum 3D Studio MaxAntworten: 0Letzter Beitrag: 30.10.04, 19:44





Zitieren
Login




