Danke für die Antworten
Beiträge von Laire
-
-
Hallo,
ich frage mich gerade, wie ich die Versionsnummer meiner Datenbank erhöhe. Passiert diese automatisch mit onUpgrade? Kann ich mir irgendwie nicht vorstellen. Muss ich irgendwo angeben, dass er die Datenbank auf die neue Version ändert?
Hier mal ein gekürztes Beispiel:
SQL Helper in der 1. Version der APP:
Code
Alles anzeigenpublic class sql_helper extends SQLiteOpenHelper { private static final String DATABASE_FILE_NAME="pzc"; private static final int SCHEMA_VERSION=1; public sql_helper(Context context) { super(context, DATABASE_FILE_NAME, null, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE pzc_haupt (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER);"); db.execSQL("CREATE TABLE pzc_unter (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, haupt INTEGER);"); db.execSQL("CREATE TABLE pzc_code (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER, haupt INTEGER, prio1 INTEGER, prio2 INTEGER, prio2 INTEGER);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
Mit der 3. Version der App kommt jetzt eine Spalte in der 1. Tabelle hinzu.
SQL Helper in der 3. Version der App
Code
Alles anzeigenpublic class sql_helper extends SQLiteOpenHelper { private static final String DATABASE_FILE_NAME="pzc"; private static final int SCHEMA_VERSION=2; public sql_helper(Context context) { super(context, DATABASE_FILE_NAME, null, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE pzc_haupt (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER, test TEXT);"); db.execSQL("CREATE TABLE pzc_unter (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, haupt INTEGER);"); db.execSQL("CREATE TABLE pzc_code (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER, haupt INTEGER, prio1 INTEGER, prio2 INTEGER, prio2 INTEGER);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion){ case 1: db.execSQL("ALTER TABLE pzc_haupt ADD COLUMN test TEXT"); break; }
Und mit einer weiteren Version noch eine Spallte:
Code
Alles anzeigenpublic class sql_helper extends SQLiteOpenHelper { private static final String DATABASE_FILE_NAME="pzc"; private static final int SCHEMA_VERSION=3; public sql_helper(Context context) { super(context, DATABASE_FILE_NAME, null, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE pzc_haupt (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER, test TEXT, test_2 TEXT);"); db.execSQL("CREATE TABLE pzc_unter (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, haupt INTEGER);"); db.execSQL("CREATE TABLE pzc_code (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, unter INTEGER, haupt INTEGER, prio1 INTEGER, prio2 INTEGER, prio2 INTEGER);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion){ case 1: db.execSQL("ALTER TABLE pzc_haupt ADD COLUMN test TEXT"); break; case 2: db.execSQL("ALTER TABLE pzc_haupt ADD COLUMN test_2 TEXT"); break; }
-
Hallo,
meine App umfasst teilweise größere Datenmengen, die aber nicht jeder Nutzer braucht. Die Daten bestehen aus Datenbankeinträgen, die die App auf Wunsch des Nutzer nach der Installation von meiner Seite laden soll. Die Daten werden über ein PHP Script im JSON Format bereitgestellt, so dass die App die Daten lesen und speichern kann.
Jetzt bräuchte ich eine Idee, wie ich sicher gehen kann, dass nur die App die Daten herunterlädt und diese nicht einfach abgerufen werden können.
Ich gehe mal davon aus, das es für Fortgeschrittene kein Problem darstellt, herauszufinden auf welche Seiten die App zugreift und auch POST Daten auslesen können, oder sehe ich das falsch?
Gruß
Markus
-
Hallo,
eigentlich wollte ich das ganze mit ItemizedOverlay und onTap lösen, aber irgendwie bin ich zu blöd dazu meinen Code dahin zu ändern. Die Beispiele die ich gefunden habe beschäftigen sich nur mit Markern auf der Karte, ich habe aber eine Fläche. Jetzt wollte ich fragen ob es bei folgendem Code möglich ist, das onTouchEvent nur startet, wenn ich das Overlay anklicke.
Der Code öffnet eine Kartenansicht, dann wird mit Hilfe einer Liste von GPS Koordinaten, die ich aus einer Datei parse eine Fläche auf die Karte gezeichnet. Wenn man die Fläche anklickt soll ein Toast erscheinen, aber halt nur bei der Fläche. Momentan erscheint immer der Toast, egal wohin man klickt.
Ich wäre also sehr erfreut, wenn jemand mir entweder zeigt, wie ich das ganze in ItemizedOverlay umwandel oder halt das onTap an den Overlay binde.
Java
Alles anzeigenpackage de.bodprod.rettinfo; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.widget.Toast; public class BOSLstItemDetail extends MapActivity { /** Called when the activity is first created. */ private List<Overlay> mapOverlays; private MapController mc; ArrayList<HashMap<String, Object>> boslst; MyOverlay polygon; private MapView mapView; private GeoPoint gP; //private MyOverlay myoverlay; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.boslst_item_detail); //SQL ID der Leitstelle abfragen Intent in = getIntent(); String id = in.getStringExtra("SQL_ID"); int sql_id = Integer.valueOf(id.toString()); // Daten der Leitstelle abfragen boslst = new ArrayList<HashMap<String,Object>>(); DatabaseHandler db = new DatabaseHandler(getApplicationContext()); boslst = db.getBOSLst(sql_id); //Name der Leistelle String bosname = boslst.get(0).get("name").toString(); //GPS Koordinaten der Leistelle String lat_s = boslst.get(0).get("lat").toString(); String lng_s = boslst.get(0).get("lng").toString(); //Umwandeln der GPS Koordinaten double lat = Double.parseDouble(lat_s); double lng = Double.parseDouble(lng_s); //Geo Point setzten für Startansicht gP = new GeoPoint((int) (lat * 1E6),(int) (lng * 1E6)); mapView = (MapView) findViewById(R.id.mapview);//Creating an instance of MapView mapView.setBuiltInZoomControls(true);//Enabling the built-in Zoom Controls //Initializing the MapController and setting the map to center at the mc = mapView.getController(); mc.setCenter(gP); mc.setZoom(10); //Dateiname für GeopPoints festlegen String gps = gps.txt; //GeoPoints für malen abfragen ArrayList<GeoPoint> points = new ArrayList<GeoPoint>(); try{ InputStream koord = getAssets().open(gps); if (koord != null) { InputStreamReader input = new InputStreamReader(koord); BufferedReader buffreader = new BufferedReader(input); String line; while (( line = buffreader.readLine()) != null) { String[] point_t = line.split(","); double y = Double.parseDouble(point_t[0]); double x = Double.parseDouble(point_t[1]); points.add(new GeoPoint((int)(x*1e6), (int)(y*1e6))); } koord.close(); polygon = new MyOverlay(points); } }catch (Exception e) { Log.e("APP","Failed", e); } mapOverlays = mapView.getOverlays(); mapOverlays.add(polygon); } @Override protected boolean isRouteDisplayed() { return false; } class MyOverlay extends Overlay{ ArrayList<GeoPoint> geoPoints; public MyOverlay(ArrayList<GeoPoint> points){ geoPoints = points; } public void draw(Canvas canvas, MapView mapv, boolean shadow){ Paint paint = new Paint(); paint.setColor(Color.parseColor("#88ff0000")); paint.setAlpha(50); paint.setStyle(Paint.Style.FILL_AND_STROKE); //Create path and add points Path path = new Path(); Point firstPoint = new Point(); mapView.getProjection().toPixels(geoPoints.get(0), firstPoint); path.moveTo(firstPoint.x, firstPoint.y); for(int i = 1; i < geoPoints.size(); ++i){ Point nextPoint = new Point(); mapView.getProjection().toPixels(geoPoints.get(i), nextPoint); path.lineTo(nextPoint.x, nextPoint.y); } //Close polygon path.lineTo(firstPoint.x, firstPoint.y); path.setLastPoint(firstPoint.x, firstPoint.y); canvas.drawPath(path, paint); super.draw(canvas, mapView, shadow); } public boolean onTouchEvent(MotionEvent event, MapView mapView) { //---when user lifts his finger--- if (event.getAction() == 1) { GeoPoint pp = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); Toast.makeText(getBaseContext(), pp.getLatitudeE6() / 1E6 + "," + pp.getLongitudeE6() /1E6 , Toast.LENGTH_SHORT).show(); } return false; } } }
-
Wenn die Firma Ihrer Produkte auf der Internetseite nicht in einer Datenbank verwaltet, auf die dann das App und die Website zugreifen können, dann würde ich der Firma erstmal einen Neuaufbau Ihrer Internetpräsenz anbieten.
-
Hallo,
ich habe bisher noch kein App gefunden was diese einfache Funktion erfüllt. Einfach nur GPS immer an. Auch wenn das Programm minimiert ist, oder zum Beispiel der Browser an ist. Außer bei meiner Navigationssoftware und MyTracks wird das GPS immer ausgeschaltet sobald ich ein Programm starte, welches nicht auf das GPS Signal zugreift.
An sich dürfte doch ein solches Tool, was im Hintergrund läuft und beim Aufrufen einfach nur die Möglichkeit bietet: "GPS immer ein" und "GPS auf Systemeinstellung" nicht all zu kompleziert sein oder?