[SQLite] Mehrere Datensätze einfügen

F

Froxx

Gast
Hallo,

ich bin gerade dabei zum 1. Mal Daten in eine SQLite-DB zu setzen und habe mir dafür einmal als Starthilfe den hier gezeigten Quelltext als Template genommen.
Java und SQLite – Tutorial – Der Blog von Benny Neugebauer
Hier ist es ja aber durch die Zeilen
Code:
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);");
so, dass es immer nur einen Datensatz gibt und der jeweils vorher erstellte durch den neuen ersetzt wird. Wenn ich mir die DB nun mit dem SQLite Database Browser anschaue, zeigt er mit meinen einen Datensatz auch an, u.z. mit einer "1" davor. Also scheint dieser Datensatz ja irgendwo nummeriert zu sein. Wo, sehe ich aber nicht wirklich.
Da ich in Sachen SQL(ite) selber noch nicht über wirklich großes Fachwissen verfüge, wollte ich euch mal fragen, wie ich es hinbekomme, dass ich eben mehrere Datensätze einfügen kann ohne ältere zu überschreiben.
Wenn ich das "create table people (name, occupation);" auskommentiere läuft der ja logischerweise auf einen Fehler, da es den Datensatz "people" ja schon gibt.
Ich habe mir das ganze irgendwie über eine 1-n-Beziehung vorgestellt, sodass alles in "people" gespeichert wird, allerdings in durchnummerierten Datensätzen darunter, also so wie es mir auch im DB-Browser dann angezeigt wird.

lg Froxx
 

Deros

Bekanntes Mitglied
oha....also langsam,
zur "Nummerierung": ohne große Ahnung von SQLite zu haben, scheint es schlau genug zu sein einen Standard-PrimaryKey angelegt zuhaben, da du selbiges ja versäumt hast. An diesem unterscheid die Datenbank dann potentielle identische Einträge.
womit wir zu deinem zweiten Problem kommen. Wenn du deine zweite Zeile auskommentierst, bekommst du wahrscheinlich keinen Fehler weil der Datensatz schonmal existierte sondern weil die Tabelle nicht existiert. die löscht dein erste Befehl nämlich jedesmal. Lass also beide zeilen weg dann sollten sich auch 2 datensätze in deine tabelle einfügen lassen.

lese dich am besten erstmal irgendwo in die grundlagen von sql ein....du scheinst da wirklich noch gaaaaaanz am anfang zu stehen
 
F

Froxx

Gast
Huch, ich meinte auch das "stat.executeUpdate("drop table if exists people;");" und nicht die 2. Zeile.
du scheinst da wirklich noch gaaaaaanz am anfang zu stehen
This^^

Aber wenn ich hier jetzt gerade sowieso schonmal poste: Ist es zwingend notwendig einen Primary-Key zu verwenden? Aus meiner Sicht scheint das ja nicht der Fall zu sein, da der DB-Browser das ja auch trennen kann. Zumindest habe ich gerade mal die beiden ersten Zeilen meines ersten Posts auskommentiert und somit einen 2. Datensatz eingefügt (hat also funktioniert *Thumbs up!*). Im Browser sieht das dann so bei mir aus:
1 | WertCol1 | WertCol2 | ...
2 | WertCol1 | WertCol2 | ...

lg Froxx
 

Deros

Bekanntes Mitglied
jede zeile deiner Tabelle MUSS eindeutig indentifizierbar sein, am besten halt anhand einer einzelnen Spalte. Stell dir vor du willst einen einzelnen Datensatz aktualisieren. Wie würdest du ihn identifizieren?

der db-browser kann deine datensätze unterscheiden, da deine datenbank automatisch eine zusätzliche spalte als primärschlüssel angelegt hat.
 
V

vanny

Gast
Ist es zwingend notwendig einen Primary-Key zu verwenden? Aus meiner Sicht scheint das ja nicht der Fall zu sein, da der DB-Browser das ja auch trennen kann.

Wie du selbst siehst, sind beide Datensätze identisch, bis auf den Primary.
Nun lass dir deine Frage nochmal durch den Kopf gehen und ich bin mir sicher, du kannst sie dir gaaaanz leicht selbst beantworten ;P

Gruß Vanny

//Edit: grml zu langsam :p
 
F

Froxx

Gast
Nunja, sicher ist mir klar, dass jeder Datensatz eindeutig erkennbar sein soll.
Ich habe mich nur gewundert, warum der DB-Browser die Datensätze voneinander unterscheiden kann, obwohl alle Felder einer Spalte die gleichen sind (außer eben die vorgsetzte Zahl), und ich manuell in meinem Quellcode keinen Primary-Key zugewiesen habe.
Darum muss ja irgendwie doch ein(e Art) Primary-Key automatisch da eingebunden worden sein. Sonst könnte ja der DB-Browser die Datensätze nicht voneinander unterscheiden.
Kann ich auf diese Art Primary-Key in meinem Quellcode dann für die Suche, Editierung und Löschung der Datensätze, welche ich noch einbauen will, auch Bezug nehmen? Oder wird sogar direkt durch den Code einer hinzugefügt und ich bin gerade einfach blind? o_O

lg Froxx
 
F

Froxx

Gast
Wieso "joke?" ? Meine Frage war zum Ende, ob ich in meinem Quellcode auf den automatisch angelegten Primary Key zurückreifen kann. Also ob ich via irgendein Befehl mir diese mir nicht ersichtliche Nummer herauslesen kann. Ich weiß nicht, warum das ein Witz sein sollte.

Naja, ich habe nun aber ein zusätzliches Problem.
Ich bin nun bei meiner Suche angelangt und möchte mir nach Angabe der zu durchsuchenden Spalte und des Suchbegriffs die jeweiligen Daten anzeigen lassen.
Meine Klasse dafür sieht folgendermaßen aus:
Code:
package asdf;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class Suche {
	
	public void search() throws Exception {
		Class.forName("org.sqlite.JDBC");
		Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");		//Erstellen einer Instanz für den Bezug auf die Datenbank
		Statement stat = conn.createStatement();	
		Scanner scan = new Scanner(System.in);			//Erstellen einer Instanz zum Lesen von Eingaben
		
		String suchart = "", suchbegriff = "";		//Spalte, in der gesucht werden soll; Wert, nach dem gesucht werden soll
		int eingabe;
		
		System.out.println("Wonach soll gesucht werden?");
		System.out.println("1 PC-Name, 2 Domain, 3 IP, 4 Subnet, 5 Gateway, 6 DNS, 7 MAC, 8 Betriebssystem, 9 Software");
		try {
			eingabe = scan.nextInt();
		} catch (Exception e) {
			System.out.println(e.toString());
			eingabe = 0;
		}
		switch(eingabe) {			//Belegen von suchart
			case 1:
				suchart = "pcname";
				break;
			case 2:
				suchart = "domain";
				break;
			case 3:
				suchart = "ip";
				break;
			case 4:
				suchart = "subnet";
				break;
			case 5:
				suchart = "gateway";
				break;
			case 6:
				suchart = "dns";
				break;
			case 7:
				suchart = "mac";
				break;
			case 8:
				suchart = "system";
				break;
			case 9:
				suchart = "software";
				break;
			default:
				System.out.println("Ungültiger Wert!");
				return;
		}
		System.out.println("Gib einen Suchbegriff ein: ");
		suchbegriff = scan.next();
		ResultSet rs = stat.executeQuery("SELECT * FROM computer WHERE " + suchart + "='" + suchbegriff + "'");
		while (rs.next())			//Ausgabe
		{
		  System.out.println(suchbegriff + " = " + rs.getString(suchbegriff));
		}
	}

}
Mein Problem beginnt nun nach der Eingabe des Strings suchbegriff.
Wenn ich einen Wert eingebe, welchen es nicht in der Datenbank gibt, geht er nicht in die while-Schleife, sondern geht gleich darüber weiter zum Ende der Klasse.
Wenn ich aber einen Wert eingebe, den ich vorher in die DB eingeschrieben habe, dann bekomme ich folgende Fehlermeldung:
Code:
Exception in thread "main" java.sql.SQLException: no such column: 'hallo'
	at org.sqlite.RS.findColumn(RS.java:116)
	at org.sqlite.RS.getString(RS.java:247)
	at asdf.Suche.search(Suche.java:65)
	at asdf.Test.main(Test.java:25)
Aber "wieso?" frage ich ich mich. Er sagt mir, dass es keine Spalte "hallo" gibt, aber danach suche ich ja auch garnicht. Ich suche ja nach Datensätzen, in denen der WERT "hallo" in der Spalte "pcname" ist.

In der DB selber habe ich schon geschaut. Das mit der Abspeicherung funktioniert alles und mir werden alle Datensätze richtig angezeigt.
Ich bin gerade ein wenig ratlos :<

lg Froxx
 
F

Froxx

Gast
*Batsch*
Habe es gerade selber gefunden. Unten in der while-Schleife sollte ich natürlich beim getString suchart und nicht suchbegriff eingeben.
Somit wäre ich vorerst wieder problemlos^^
Falls wieder was anliegt: Ihr hört von mir ;)

lg Froxx
 
V

vanny

Gast
den ResultSet hat ne nette Methode namens "getMetaData()"
Da kannst du dir die Anzahl und die Namen der gefundenen Spalten ausgeben lassen und kommst vielleicht auch an deinen Primary ran.

Gruß Vanny
 

Deros

Bekanntes Mitglied
sinnvoller wäre es wohl den pk richtig in der tabledefintion anzugeben, sprich "CREATE TABLE PEOPLE(ID INTEGER PRIMARY KEY ASC, NAME, ...);"
 
F

Froxx

Gast
Ich habe nun mal einen PK als eigenes Feld hinzugefügt und möchte ihn nach dem Motto "nummeriere PK von zu erstellendem datensatz mit 'anzahl vorhandener datensätze' + 1" generieren. Dafür muss ich natürlich ersteinmal die Datensätze zählen. Das hatte ich mit dem Countbefehl vor, sodass meine Zeile dafür so aussieht:
Code:
prep.setString(1, "select count(*) from computer;");
Wenn ich nun aber per syso(prep) eine Ausgabe direkt hintenranhänge, bekomme ich folgende Ausgabe:
Code:
org.sqlite.PrepStmt@996cca
bzw.
Code:
org.sqlite.PrepStmt@19c7c21
Eine dieser Aussagen kommt immer random, wobei ich zwischendurch nichts am Code verändere. Einfach kompilieren.
Wieso kommt das so, bzw. was bedeutet das? Ich hätte jetzt eher eine Ausgabe wie "3" erwartet oder soetwas. Also eben die Anzahl meiner Datensätze im table computer.

lg Froxx
 

turtle

Top Contributor
select count(*) from computer

Dieses SQL-Statement gibt, wie jedes andere Select-Statement auch, einen ResultSet zurück, in dem in diesem Beispiel eine Zahl drinsteckt, die Du erst extrahieren musst.

PS: Wenn Du die Primary Key-Spalte als INTEGER PRIMARY KEY definiert hast, inkrementiert sqlite den Wert automatisch. Über die Funktion sqlite3_last_insert_rowid() kannst Du den letzten Key abfragen.

Dieses Vorgehen, es die DB machen zu lassen,ist einen Empfehlung, da dann erstens nicht so viele Abfragen an die DB kommen und dieses auch stabil läuft bei mehreren Benutzern/Transaktionen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T SQLite Alternativen zu SQlite, dateibasiert, leicht verschlüsselbar, Nutzerverwaltung Datenbankprogrammierung 21
B SQLite + jdbc + IntelliJ-Consumer = "No suitable driver found..." Datenbankprogrammierung 15
Maxim6394 JPA 3.2 & SQLite - LocalDateTime wird falsch geladen Datenbankprogrammierung 1
Maxim6394 EclipseLink + SQLite | Unable to acquire a connection from driver [null] Datenbankprogrammierung 6
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
thor_norsk SQLite Fehlermeldung Datenbankprogrammierung 4
N JDBC SQLITE und Cascading Datenbankprogrammierung 2
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
B SQLite Befehl bauen? Datenbankprogrammierung 4
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
D SQLite Collections oder Arrays in SQLite abbilden Datenbankprogrammierung 7
N ORM für Sqlite Datenbankprogrammierung 4
M SQLite Datenbank mit SQLite Datenbankprogrammierung 7
N Sqlite DB mit Java wird auf Linuxsystem nicht gefunden Datenbankprogrammierung 9
N SQLite Datenbankprogrammierung 2
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
E Sqlite-jdbc Mitliefern Datenbankprogrammierung 4
X Sqlite Fks Datenbankprogrammierung 4
C JDBC und SQLite Datenbank Datenbankprogrammierung 8
X SQLite SQLite Programm beendet/führt nicht weiter aus Datenbankprogrammierung 12
Sam96 SQLite mit JavaFX Datenbankprogrammierung 1
T sqlite select Datenbankprogrammierung 12
V SQLite Performance: 1 Datei mit einzelnen Einträgen gegenüber SQLite Datenbankprogrammierung 7
F Java SQLite Error Datenbankprogrammierung 19
F Sqlite cannot commit Datenbankprogrammierung 2
H SQLite Sqlite Datenbank direkt einbinden. Datenbankprogrammierung 5
U Dom Parser und SQLite füllen Datenbankprogrammierung 5
D SQLite Datenkbank auf WebServer möglich? Datenbankprogrammierung 4
M Datenbankausgabe .jsp per SQLite Datenbankprogrammierung 7
J SQLite Login Datenbank Datenbankprogrammierung 2
M SQLite Einstieg mit SQLite, wohin mit der DLL? Datenbankprogrammierung 7
M SQLite Speicherpfad Datenbankprogrammierung 0
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
G sqlite innerjoin Datenbankprogrammierung 5
G SQLite Daten aus SQLite DB in andere SQLite DB importieren Datenbankprogrammierung 4
R sqlite UPDATE wirkt nicht aus Java Datenbankprogrammierung 7
G SQLite SQLite Abfrage Datenbankprogrammierung 4
F SQLite-Extensions unter Java Datenbankprogrammierung 2
H SQLite mit DefaultTableModel synchronisieren Datenbankprogrammierung 5
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
L SQLite fügt nur den ersten Datensatz ein Datenbankprogrammierung 2
S SQLite Ausführbares Jar mit SQLite DB Datenbankprogrammierung 4
H SQLite Datenkbank erstellen Datenbankprogrammierung 3
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
Kasoki SQLite SQLite oder doch XML!? Datenbankprogrammierung 2
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
G SQLJet (SQLite) - Mehrbenutzerzugriff auf Datenbank handhaben Datenbankprogrammierung 1
S SQLite in JAR Datenbankprogrammierung 8
J SQLite --> Java SDK Datenbankprogrammierung 7
P Datenbank für Java Anwendung wie SQLite ohne Installation Datenbankprogrammierung 4
P Sqlite API für JAVA ? Datenbankprogrammierung 9
feuervogel SQLite unter Linux mit Eclipse einrichten Datenbankprogrammierung 8
K SQLite Datenbankprogrammierung 5
S SQLite oder RDBMS als Datei(nicht Client/Server) Datenbankprogrammierung 5
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
J Mehrere WHERE Werte benutzen Datenbankprogrammierung 2
G ID zuweisung eines TerminKalenders (mehrere Kalender) Datenbankprogrammierung 8
K Mehrere Benutzer Datenbankprogrammierung 6
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
E Mehrere Tabellenspalten mit INNER JOIN verknüpfen Datenbankprogrammierung 1
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
S HSQLDB Mehrere PreparedStatements ausführen Datenbankprogrammierung 3
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
J Mehrere Inserts bei Fehlschlag abbrechen Datenbankprogrammierung 2
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
M DB: Mehrere Zeilen in einer Zeile zusammenführen Datenbankprogrammierung 10
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
T Theoriefrage : mehrere User vs gleichen Datensatz Datenbankprogrammierung 4
multiholle SQL Querry über mehrere Spalten Datenbankprogrammierung 12
N mehrere Abfragen nacheinander wie mit MS Access mit JAVA Datenbankprogrammierung 3
O Mittelwert über mehrere Zeilen Datenbankprogrammierung 11
G Mehrere Tabellen abfragen Datenbankprogrammierung 7
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
T JAVA JDBC mehrere Anfragen direkt hintereinander ausführen Datenbankprogrammierung 2
S Select über mehrere Datenbanksysteme Datenbankprogrammierung 14
M Mehrere Tabellen zusammenführen Datenbankprogrammierung 4
W Prepared Statement mehrere Zeichenketten Datenbankprogrammierung 4
F Mehrere unterschiedliche ResultSets Datenbankprogrammierung 7
P [Hibernate] Mehrere Keys in einem <set> Datenbankprogrammierung 11
G Insert-anweisung mehrere Varianten eine geht Datenbankprogrammierung 2
N mehrere tables hintereinander Datenbankprogrammierung 4
W Nur ein Datensatz wird angezeigt, obwohl mehrere existieren Datenbankprogrammierung 7
N Mehrere Abfragen gleichzeitig - was passiert da? Datenbankprogrammierung 6
L mehrere Abfragen mit einem Statement!? Datenbankprogrammierung 5
M Mehrere ResultSets gleichzeitig verwenden Datenbankprogrammierung 3
L Mehrere SQL-Statements gleichzeitig!? Datenbankprogrammierung 5
F mehrere Datenbankupdates nacheinander Datenbankprogrammierung 3
M Datensätze in DataGrip (IntelliJ) Datenbankprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben