Städteführer App (Facharbeit)

D

deni100

Ambitioniertes Mitglied
3
Hallo Jungs und Mädels, ich mache gerade mein Fachabi und mein Abschlussprojekt ist eine App für eine Stadt. (Städteführer).
Ich habe schon eine Datenbank erstellt und meine Gui ist fertig. Ich kann auch schon GPS Daten empfangen.
Mein Ziel ist es durch die Datenbank die Koordinaten der jeweiligen Sehenswürdigkeiten mit den GPS Koordinaten von meinem Standort zu berechnen und somit die Entfernung zu berechnen, außerdem wollte ich eine Richtungsanzeige (Luftlinie) implementieren.
Was empfiehlt ihr mir, wie ich jetzt voran gehen könnte um mein Problem zu lösen.
Ich möchte auf keinen Fall fertige Lösungen oder irgendwie Codes sehen, sondern eher Tipps wie ich vielleicht Koordinatenberechnung in Android und Richtungsanzeige realisieren könnte.
Mit freundlichen Grüßen
deni100
 
Das ist sicher einer der elegantesten wege.^^
Ich hätte jetzt für die Richtungspfeile aus den zwei Koordinaten einen Richtungsvektor berechnet der in die entsprechende Richtung zeigt.
 
Eine Frage:
Habe z.B jetzt 10 Einträge in meiner Datenbank und ich habe Felder wie ID, Sehenswürdigkeitenname und so.. jedoch muss ich jedesmal die ID von sich selbst eingeben, gibt es eine Möglichkeit, dass ich die Einträge in der Datenbank zähle oder gibt es da eine Methode dafür?
 
Wie meinst du das, du mußt die ID von sich selbst jedes mal eingeben? Was willst du denn erreichen? Oder willst du nur die Einträge in der DB zählen?

Vermutlich suchst du nur eine Möglichkeit, deine Daten in der Datenbank abzufragen?
 
Ich meine ich hab jetzt 10 Einträge.
Angenfangen
Id 1 Name :Hotel
Id 2 Name : Bahnhof
und jedesmal wenn ich in die Datenbank etwas neues einfügen will, muss ich manuell die ID auch mitschreiben, das heißt ich muss die 3 als Id manuell selber eingeben, wie kriege ich die Anzahl der Einträge heraus, sodass ich einfach dann die ID automatisch für den nächsten Eintrag ermitteln kann.
MfG
 
mradlmaier schrieb:
Beachte: Es ist Android Konvention, dass dieses autoincrement primarykey feld "_id" heissen MUSS!

Ja das habe ich schon bemerkt, trotzdem vielen Dank :)
 
Soweit ich weiß gilt die Konvention _id nur für SimpleCursorAdapter und nicht im allgemeinen. Da ich immer eigene Adapter verwende bin ich auch noch nie über dieses Problem gestolpert.

Hier gibts noch einen interessanten Thread dazu: listview - Android column '_id' does not exist? - Stack Overflow

Ein Trick wäre z.B. SELECT t.*,t.id as _id FROM table t, damit der SimpleCursorAdapter funktioniert, ohne wirklich eine Spalte in der DB _id zu nennen.
 
  • Danke
Reaktionen: deni100 und DieGoldeneMitte
Code:
public class ShAuswahl extends ListActivity{
	
	final static String MY_DB_NAME = "Guide";
	final static String MY_DB_TABLE = "SH";
	final static String tag="ensacom"; 
	private static final int COLUMN_INDEX_TITLE = 1; //Titel des Contextmenüs

	public static final int EDIT_ID = Menu.FIRST;
	public static final int DELETE_ID = Menu.FIRST + 1;
	public static final int ZIEL_ID = Menu.FIRST + 2;
	private SQLiteDatabase Datenbank;
	private DatenbankManager Helper;
	
	private static final String KLASSEN_SELECT_RAW = //rohe sql-anfrage
	"SELECT _id , name FROM SH";
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main88);
		Helper = new DatenbankManager(this);			
		;		
		
	}
	
	
	protected void onResume(){
		String text = "Datenbank wurde geoeffnet";
		super.onResume();
		Datenbank = Helper.getReadableDatabase();
		Toast eintoast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
		eintoast.show();		
	ladeDaten();
	}
	private void ladeDaten() {
		//		Cursor klassencursor =Datenbank.rawQuery(KLASSEN_SELECT_RAW, null); //zeiger auf element der ergebnismenge
				Cursor klassencursor =Datenbank.query("SH", 
						new String[] {
							"_id",
							"name",
							"longitude",
							"latitude",
							"info"
						}, 
						null, null, null, null, null);
				startManagingCursor(klassencursor); 
			
				SimpleCursorAdapter klassenadapter = new SimpleCursorAdapter (this, android.R.layout.simple_list_item_1,klassencursor,
						new String[] {"name"}, 
						new int []{android.R.id.text1}
				);
				setListAdapter(klassenadapter);
	}
	@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    	AdapterView.AdapterContextMenuInfo info;
        try {
             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        } catch (ClassCastException e) {
            Log.e("Guide", "bad menuInfo", e);
            return;
        }

       Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
       if (cursor == null) {
            // For some reason the requested item isn't available, do nothing
            return;
        }

        menu.setHeaderTitle(cursor.getString(COLUMN_INDEX_TITLE));

        menu.add(0, EDIT_ID, 0, R.string.cmEdit);
        menu.add(0, DELETE_ID, 0, R.string.cmDelete);
        menu.add(0, ZIEL_ID, 0, R.string.cmZiel);
    }
	public boolean onContextItemSelected(MenuItem item) {		
		AdapterView.AdapterContextMenuInfo info;
        try {
             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        } catch (ClassCastException e) {
            Log.e("Guide", "bad menuInfo", e);
            return false;
        }
		
		switch (item.getItemId()) {
    		case EDIT_ID:
    			Log.v("Guide", "Edit Guide with id: "+""+info.id); 
    			return true;
    		case DELETE_ID:
    			Log.v("Guide", "Delete Gui with id: "+""+info.id);
    			return true;
    		case ZIEL_ID:
    			Log.v("Guide", "Entfernung with id: "+""+info.id);
    		default:
    			return super.onContextItemSelected(item);
    		}
    	}
	
	protected void onPause(){
		String text = "Datenbank wurde geschlossen";
		Datenbank.close();
		super.onPause();
		Toast eintoast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
		eintoast.show();
		
	}

}


Hier kriege ich keine Fehlermeldung, ich versuche aus der Datenbank zu lesen und wenn ich auf einen Eintrag klicke ,soll ein Menü erscheinen, doch es passiert nichts, wo ist mein Fehler :huh:

Die Datenbank wird ausgelesen, doch beim klicken öffnet sich kein Kontextmenü :/
 
im onCreate fehlt registerForContextMenu(YourView);
 
  • Danke
Reaktionen: deni100
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
} catch (ClassCastException e) {
Log.e("Guide", "bad menuInfo", e);
return false;
}

switch (item.getItemId()) {
case EDIT_ID:
Log.v("Guide", "Bearbeite Sehenswürdigkeit: "+""+info.id);
return true;
case DELETE_ID:
Log.v("Guide", "Lösche Sehenswürdigkeit: "+""+info.id);
delete(1);
ladeDaten();
return true;
case ZIEL_ID:
Log.v("Guide", "Entfernung with id: "+""+info.id);

default:
return super.onContextItemSelected(item);
}
}

Wie kriege ich denn jetzt die _id des jeweiligen Items heraus, bin schon am suchen, aber irgendwie will es nicht klappen
 
Code:
 String sSelect ="SELECT longitude,latitude FROM SH WHERE _id="+info.id;
    			Cursor mustafa=     Datenbank.rawQuery(sSelect, null);
    			startManagingCursor(mustafa);
    			int view[] = {R.id.textView2, R.id.textView3};
    			String col[] = { "latitude", "longitude"};
    			SimpleCursorAdapter ca = new SimpleCursorAdapter(
    			        this, R.layout.main88, mustafa, col, view);
    			
    			
    			
    			TextView test = (TextView) findViewById(R.id.textView1);
    			test.setText(ca.getStringConversionColumn());


Wo ist denn mein Fehler, ich versuche eine SQL Abfrage zu machen und als Fehler kommt
column '_id' does not exist
 
Tom299 schrieb:
Soweit ich weiß gilt die Konvention _id nur für SimpleCursorAdapter und nicht im allgemeinen.

deni100 schrieb:
Code:
 String sSelect ="SELECT longitude,latitude FROM SH WHERE _id="+info.id;
                Cursor mustafa=     Datenbank.rawQuery(sSelect, null);
[...]
                SimpleCursorAdapter ca = new SimpleCursorAdapter(
                        this, R.layout.main88, mustafa, col, view);
Wo ist denn mein Fehler, ich versuche eine SQL Abfrage zu machen und als Fehler kommt
column '_id' does not exist
Der Fehler muss ja auch kommen, hoffentlich aber erst wenn Du den SimpleCursorAdapter instanzierst, denn dein Cursor enthält nicht die Spalte "_id".
Probier es mal hiermit:
Code:
String sSelect ="SELECT _id,longitude,latitude FROM SH WHERE _id="+info.id;
oder
Code:
String sSelect ="SELECT * FROM SH WHERE _id="+info.id;
Hast Du das Notepad Tutorial von developer.android.com schon durchgearbeitet? Wenn nicht solltest Du es tun, dauert nicht lange und die meisten Deiner hier gestellten Fragen werden dort behandelt.
 
  • Danke
Reaktionen: deni100
Code:
Cursor klassencursor =Datenbank.query("SH", 
						new String[] {
							"_id",
							"name",
							"longitude",
							"latitude",
							"info"
						}, 
						null, null, null, null, null);
				startManagingCursor(klassencursor); 
			
				SimpleCursorAdapter klassenadapter = new SimpleCursorAdapter (this, android.R.layout.simple_list_item_2,klassencursor,
						new String[] {"longitude","latitude"},
						new int []{android.R.id.text1,android.R.id.text2}
				);
				setListAdapter(klassenadapter);


Ich hab das jetzt so realisiert, ich frage mich jetzt

" new String[] {"longitude","latitude"}," wie kann ich das benutzen, also z.B als Parameter bei einer MEthode zu benutzen. Im Moment sind das ja Strings..
 
Die Strings sind die Spaltennamen. Du mußt schon den Cursor benutzen um auf die Inhalte selbst zuzugreifen.

Also z.B. klassencursor.getString(klassencursor.getColumnIndex("longitude"));

Oder meinst du was anderes? ;-)
 
  • Danke
Reaktionen: deni100
Tom299 schrieb:
Die Strings sind die Spaltennamen. Du mußt schon den Cursor benutzen um auf die Inhalte selbst zuzugreifen.

Also z.B. klassencursor.getString(klassencursor.getColumnIndex("longitude"));

Oder meinst du was anderes? ;-)


Ja das meinte ich, aber als Fehler kommt"android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1"
 
Dann mußt du ihn positionieren, gibt sowas wie .movetoFirst(), .moveToPosition(position) usw. ...
 
  • Danke
Reaktionen: deni100
Code:
double latitude = Double.parseDouble(klassencursor2.getString(klassencursor2.getColumnIndex("latitude")));
				double longitude = Double.parseDouble(klassencursor2.getString(klassencursor2.getColumnIndex("latitude")));
				 Location location = obj.locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
				 
				
				 
				 String    message= (""+obj.distance(location.getLatitude(),location.getLongitude(), latitude, longitude));
				
				Toast.makeText(obj, message, Toast.LENGTH_LONG).show();Toast.makeText(obj, message,
						Toast.LENGTH_LONG).show();

So habe jetzt von meiner GPS Klasse ein Objekt angelegt und versuche die Methode Distance() zu benutzen, soweit so gut, jedoch kriege ich irgendwie ein Java.lang.nullpointer exception, irgendwo ist da ein kleiner Fehler, den ich gerade nicht sehen kann ..



Ich sehe gerade , dass ich ein Problem beim Anlegen des Objektes habe
GPS obj=new GPS();

so habe ich das Objekt angelegt.


" threadid=1: thread exiting with uncaught exception (group=0x4001e578)" das kommt auch als Fehler
 
Zuletzt bearbeitet:

Ähnliche Themen

Manny87
  • Manny87
Antworten
11
Aufrufe
159
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.003
Robby1950
R
netfreak
  • netfreak
Antworten
10
Aufrufe
453
netfreak
netfreak
Zurück
Oben Unten