# SQLite Statement nimmt keine Namen aus getter-Methoden



## d9 (9. Feb 2012)

ich habe folgendes Problem:

ich will in einer Spatialite Datenbank eine Tabelle erstellen, die den Namen anhand von einer Getter-Methode einer anderen Klasse bekommt, der Code sieht folgendermaßen aus:


```
private static String trname = Track.getTrackname();      // "2012Feb06"

private static void initDatabase() throws ClassNotFoundException{	
	Class.forName("org.sqlite.JDBC");
	conn = null;
	String track = "abc"; 
	track= trname;
	try {
		SQLiteConfig config = new SQLiteConfig();
		config.enableLoadExtension(true);
		Connection conn = DriverManager.getConnection("jdbc:sqlite:spatialite.sqlite", config.toProperties());
		Statement stmt = conn.createStatement();
		stmt.setQueryTimeout(30); 
		stmt.execute("SELECT load_extension('libspatialite-2.dll')");
		String sql = "SELECT InitSpatialMetadata()";
		stmt.execute(sql);
		// creating a POINT table
		sql = "CREATE TABLE ";
		sql += track;
		sql += "(id INTEGER NOT NULL PRIMARY KEY,";
		sql += "name TEXT NOT NULL)";
		System.out.println(sql);
		stmt.execute(sql);
```

nach dem execute kommt immer ein 

[SQLITE_ERROR] SQL error or missing database (unrecognized token: "2012Feb6")

das System.out.println zeigt mir aber die normal übliche SQL schreibweise für das statement:

CREATE TABLE 2012Feb6(id INTEGER NOT NULL PRIMARY KEY,name TEXT NOT NULL)


wenn ich aber das 
	
	
	
	





```
track= trname;
```
 weglasse, erzeugt er mir ganz normal die Tabelle "abc". Kann das sein dass das prepared statement keine getter Methoden verträgt? wenn ja, wie kann ich das dann lösen?


----------



## SlaterB (9. Feb 2012)

deine Frage entbehrt jeder Grundlage,

du hast 

```
String track = "abc";
```
wenn du es dabei belässt, kommt "abc" in die Query, alles funktioniert

dann hast du noch einen String trname, in dem wie du selber sagst "2012Feb06" drinsteht,
wenn du diesen String mit

```
track= trname;
```
miteinbeziehst landet  "2012Feb06" im SQL und macht Probleme,

wo ist hier jetzt irgendeine Überraschung? es gibt doch sicher keine Tabelle, die so heißt?
entweder du willst "abc" oder "2012Feb06" in der Query haben, mache was du möchtest und lebe dann mit den Konsequenzen?

-----

kleine Vermutung da du so stark von getter sprichst:
wenn du

```
track= trname;
```
ausführst, wird nicht zu genau diesem Zeitpunkt erneut der getter ausgeführt, sondern das passierte schon vorher, wann auch immer,
diese Codezeile bewirkt nicht mehr und nicht weniger, dass genau der String-Inhalt übernommen wird


----------



## d9 (9. Feb 2012)

hallo slater, deine antworten sind immer die besten 

mein problem ist, der String, den ich durch die Getter Methode bekomme, wird vom Statement nicht angenommen.
mit dem String "abc" wollte ich nur zeigen, dass wenn ich einen String in derselben Klasse erzeuge wo das Statement liegt, das Statement sehr wohl ausgeführt wird (es wird nämlich die Tabelle "abc" erzeugt)
ich WILL aber einen String aus einer anderen Klasse holen und dann die Tabelle mit demjenigen Namen erzeugen, funktioniert aber so nicht...


----------



## Gast2 (9. Feb 2012)

Dann zeig doch mal den Code mit dem Getter plus die Klasse in der der Getter implementiert ist.


----------



## XHelp (9. Feb 2012)

Versuch es mal mit 
	
	
	
	





```
sql += "["+track+"]";
```
, vermutlich verwendest du einfach nicht ganz zulässige Tabellennamen
(oder 
	
	
	
	





```
`
```
, statt 
	
	
	
	





```
[
```
, bin mir da gerade nicht sicher)


----------



## SlaterB (9. Feb 2012)

> mein problem ist, der String, den ich durch die Getter Methode bekomme, wird vom Statement nicht angenommen.

dass der Tabellenname nur deshalb abgelehnt wird, weil er aus dem getter kommt, ist weitgehend auszuschließen,

wenn dann sage doch einfach 'mein Tabellenname '2012Feb06' wird nicht angenommen',
oder ist das 'abc', welches du direkt vorgibst, exakt derselbe Name?

vergleiche gegebenenfalls track und trname, wenn der eine akzeptiert wird, und der andere nicht, dann sind sie bestimm nicht equal


----------



## d9 (9. Feb 2012)

die Klasse Track, von der ich den Namen hole:

```
public class Track {
	private static String trackname;


	public static String getTrackname() {
		return trackname;
	}
	
	public void setTrackname(String trackname) {
		this.trackname = trackname;
	}
}
```
 
die Klasse FileDataAccess, in der ich aus einer GPX Datei die Werte herauslese:


```
public static List<TrackPoint> getPoints(File gpxFile) {
	List<TrackPoint> points= null;

	try {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();


		FileInputStream fis = new FileInputStream(gpxFile);
		Document dom = builder.parse(fis);
		Element root = dom.getDocumentElement();
		
		NodeList items = root.getElementsByTagName("name");
		
		Node it = items.item(0);
		
		final Track track = new Track();
		
		System.out.println("Name des Tracks: "+ it.getTextContent());
		track.setTrackname(it.getTextContent());                 // hier setze ich den tracknamen
		
		items = root.getElementsByTagName("trkpt");
                

                //und so weiter......
```
der Code aus dem 1. Posting ist übrigens in einer eigenen Klasse

fakt ist doch, dass ich zuerst aus der Datei herauslese, den Tracknamen abspeichere, und dann erst die Datenbank öffne. Bzw dass der Trackname wohl im 
	
	
	
	





```
System.out.println(sql);
```
 aus dem ersten Posting angezeigt wird.


----------



## SlaterB (9. Feb 2012)

nochmal konzentriert:
bisher hast du duch Fakten allein 
> [SQLITE_ERROR] SQL error or missing database (unrecognized token: "2012Feb6")
unterlegt, bei 2012Feb6 würde ich auch stark vermuten dass so keine DB-Tabelle der Welt heißt, 
mit gewisser Wahrscheinlichkeit auch als Tabellenname gar nicht möglich ist, beginnt mit Zahl

ich verstehe nicht wieso du dich jetzt auf andere Tabellen "abc", auf getter oder XML-Auswertung konzentrierst,
stattdessen:
gibt es überhaupt eine entsprechende Tabelle?
funktioniert eine ganz simple fertige SQL-Abfrage, ohne jede Variablen, "SELECT * FROM 2012Feb6"?


----------



## d9 (9. Feb 2012)

@XHelp

Vielen Dank für deinen Tipp, anscheinend mag es irgendeine Methode im Code nicht, wenn ich im GPX File einen Namen im Feld <name> gespeichert habe, der mit einer Zahl anfängt! Habe deswegen die Anordnung verändert in Feb62012 und es klappt ohne Probleme!


----------



## d9 (9. Feb 2012)

@slater

ja anscheinend darf die Tabelle nicht mit einer Zahl beginnen!


----------



## SlaterB (9. Feb 2012)

> anscheinend mag es irgendeine Methode im Code nicht

der Code ist bestimmt nicht schuld, die DB,

wie ich jetzt bemerke wird die Tabelle auch erst angelegt, das macht es natürlich bisschen schwieriger zu bewerten,


----------



## Gast2 (9. Feb 2012)

d9 hat gesagt.:


> die Klasse Track, von der ich den Namen hole:
> 
> ```
> public class Track {
> ...



Erm.... [c]private static String trackname[/c] und [c]public static String getTrackname()[/c]? Da solltest du dir nochmal Gedanken drüber machen...


----------

