Chiarimento maps e implementazione

di il
31 risposte

Chiarimento maps e implementazione

Buongiorno amici

sto realizzando un hotspot finder che usa in db sqllite.
Il mio problema è questo che riesco a salvare tutte le info degli hotspot nel database e anche la latitudine e longitudine di dove mi trovo al momento della ricerca per avere le coordinate degli hotspot.

il mio problema però è che ora queste coordinate che sono di tipo double le vorrei riottenere per disegnare sulla mappa tutte le coordinate ed aggiungerci un mark...

vorrei fare un array di latlng cosi da ridisegnarli tutto dentro un ciclo for...

per chiarimento vi posto i metodi del db per salvare i dati e la classe access point

DATABASE:

        String CREATE_HOTSPOT_TABLE = "CREATE TABLE hotspot ( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                "name TEXT, "+
                "security TEXT, " +
                "coperture INTEGER," +
                "latitude DOUBLE," +
                "longitude DOUBLE)";
        // create books table
        db.execSQL(CREATE_HOTSPOT_TABLE);
    }


    public void addAccessPoint(AccessPoint ap){
        Log.d("accesspoint", ap.toString());
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
 
        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(KEY_SSID, ap.getName()); // get name rete 
        values.put(KEY_SECURITY, ap.getSecurity()); //get security
        values.put(KEY_COPERTURE, ap.getCoperture());// get coperture
        values.put(KEY_LATITUDE, ap.getLatitude());
        values.put(KEY_LONGITUDE, ap.getLongitude());
        // 3. insert
        db.insert(TABLE_ACCESSPOINT, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values
 
        // 4. close
        db.close(); 
        
        
    }  




La classe ACCESSPOINT:


public class AccessPoint {
	
	private int id;
	private String name;
	private String security;
	private int coperture;
	private double latitude;
	private double longitude;
	
	public AccessPoint(){
		
	}
	
	public AccessPoint(String name, String security, int coperture, double latitude, double longitude){
		super();
		
		this.name = name;
		this.security = security;
		this.coperture = coperture;
		this.latitude = latitude;
		this.longitude = longitude;
	}
	
	public long getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String getSecurity(){
		return security;
	}
	
	public void setSecurity(String security){
		this.security = security;
	}

	public int getCoperture(){
		return coperture;
	}
	
	public void setCoperture(int coperture){
		this.coperture=coperture;
	}
	
	public double getLatitude(){
		return latitude;
	}
	
	public void setLatitude(double latitude){
		this.latitude = latitude;
	}
	
	public double getLongitude(){
		return longitude;
	}
	
	public void setLongitude(double longitude){
		this.longitude = longitude;
	}
	
	@Override
    public String toString() {
        return "AccessPoint [id=" + id + ", nomeRete=" + name + ", Sicurezza=" + security + ", Copertura=" + coperture + ", Latitudine=" + latitude + ", Longitudine=" + longitude
                + "]";
    }
	
	public String toStringName(){
		return "NomeRete =" + name;
	}
	
	

}
spero possiate aiutarmi

31 Risposte

  • Re: Chiarimento maps e implementazione

    Può essere giusto fare una query di questo tipo???
    public ArrayList<LatLng> getInformation(){
    	ArrayList<LatLng> coordinatesToMap = new ArrayList<LatLng>();
    	// 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
    	Cursor c = db.rawQuery("SELECT name,latitude,longitude FROM hotspot" , null);
    	if(c.moveToFirst()){
            do{
               //assing values 
              // name = c.getString(0);
              double latitude= c.getDouble(1);
              double longitude = c.getDouble(2); 
               LatLng coordinates = new LatLng(latitude,longitude);
               coordinatesToMap.add(coordinates);
        //Do something Here with values
    
            }while(c.moveToNext());
        }
    	return coordinatesToMap;
    
  • Re: Chiarimento maps e implementazione

    Si, il codice in realtà ti restituisce una lista e non un array, ma se ciò ti sta bene allora il codice è corretto.
    Qualche appunto:
    • Poiché usi il DB in sola lettura è consigliabile ottenere un riferimento tramite il metodo "getReadableDatabase()"
    • Il riferimento al cursore e al DB vanno chiusi una volta che non ti servono più
    • Per scorrere tutti i risultati puoi usare il seguente codice, che è più comodo da scrivere e leggere:
      
      Cursor c = .... ;
      while (c.moveToNext()) {
          ...
      }
      c.close();
      
  • Re: Chiarimento maps e implementazione

    Sisi ho risolto, ora riesco a disegnare cio che mi serve sulla mappa... ultimo chiarimento ma per non ripetere i dati come posso fare??

    cioè io vorrei che se rieseguo la scansione le reti che ha gia trovato me le sostituisca e non che mi ripeta la stampa... cioe se trovo gia alice 123 non voglio che la seconda volta stampi alice 123 alice 123
  • Re: Chiarimento maps e implementazione

    Attraverso una query "SELECT DISTINCT name,latitude,longitude FROM hotspot" il DB ti restituisce solo le tuple che presentano valori diversi per i 3 campi selezionati.. In questo modo risolvi il problema a monte
  • Re: Chiarimento maps e implementazione

    Quindi per ottenere il nome degli hotspot io crerei un metodo di questo tipo a me serve una lista di nomi
    Public ArrayList<AccessPoint> getallAP(){
    faccio la connessione al db
    faccio la query(Select distinct name from hotspot)
    uso il cursor
    poi creo un nuovo oggetto di tipo accessPoint 
    ma non vorrei che però nel creare un nuovo accesspoint mi chiede anche gli altri campi e a me serve solo il nome, perchè attualmente come query ce l'ho cosi:
    //Get All accesspoint
    public List<AccessPoint> getAllAP() {
        List<AccessPoint> apoints = new LinkedList<AccessPoint>();
    
        // 1. build the query
        String query = "SELECT DISTINCT * FROM " + TABLE_ACCESSPOINT ;//+ "WHERE name HAVING COUNT = 1";
    
        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
    
        // 3. go over each row, build accesspoint and add it to list
        AccessPoint ap = null;
        if (cursor.moveToFirst()) {
            do {
                ap = new AccessPoint();
                ap.setId(Integer.parseInt(cursor.getString(0)));
                ap.setName(cursor.getString(1));
                ap.setSecurity(cursor.getString(2));
                ap.setCoperture(Integer.parseInt(cursor.getString(3)));
                ap.setLatitude(Double.parseDouble(cursor.getString(4)));
                ap.setLongitude(Double.parseDouble(cursor.getString(5)));
    
                // Add accesspoint
                apoints.add(ap);
            } while (cursor.moveToNext());
        }
    
        Log.d("getAllAPoints()", ap.toString());
    
        // return accesspoints
        return apoints;
    }
    
  • Re: Chiarimento maps e implementazione

    A parte che la query "SELECT DISTINCT *" è "sbagliata" (ogni riga ha un valore diverso per il campo chiave, per cui il DISTINCT non serve a nulla, anche se la query funziona lo stesso)..
    Non ho capito quale sia il problema: attualmente recuperi tutti i dati dal DB e quindi crei l'oggetto senza problemi ma a te servirebbe solo il nome?


    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Il problema è che cosi alla nuova ricerca degli hotspot mi inserisce due volte lo stesso campo
    tipo eseguo l'app cerca e trova alice 123 alice 456.

    stampo la lista e scrive:
    alice123
    alice456

    rieseguo la ricerca ritrova la stesse reti
    stampa la lista e scrive:
    alice123
    alice456
    alice123
    alice456

    non voglio che mi ristampa le stesse info se già le contiene ecco
  • Re: Chiarimento maps e implementazione

    Ah ok ora ho capito..beh l'unica è controllare che la lista non contenga già un oggetto con quel nome!


    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Quindi che controllo dovrei fare??

    dovrei fare un list.contains??

    tipo if list.contains(nome_rete)
    stampo nome_rete 1 volta
  • Re: Chiarimento maps e implementazione

    Più che altro se la lista contiene già il nome dell'access point puoi proprio non inserire il "doppione"


    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Della ha scritto:


    Più che altro se la lista contiene già il nome dell'access point puoi proprio non inserire il "doppione"


    Sent from my iPhone using Tapatalk

    eh ma come posso impostarlo questo controllo??
  • Re: Chiarimento maps e implementazione

    Prima di aggiungere gli elementi alla lista:
    
    if (!list.contains(nome_rete)){
        list.add(nome_rete);
    }
    
    Oppure dalla query SQL puoi ottenere i soli nomi di access point che non sono già presenti nella lista, escludendo i "doppioni":
    
    SELECT DISTINCT nome_rete FROM tabella WHERE nome_rete NOT IN ( <lista_SSID>)
    
    Ovviamente la query che ti ho mostrato è solo un "template", devi poi sistemarla con i nomi e i valori di tuo interesse...
  • Re: Chiarimento maps e implementazione

    Ok grazie ti ringrazio, provo con la prima ipotesi e poi con la seconda e ti faccio sapere
  • Re: Chiarimento maps e implementazione

    Della ha scritto:


    Prima di aggiungere gli elementi alla lista:
    
    if (!list.contains(nome_rete)){
        list.add(nome_rete);
    }
    
    Oppure dalla query SQL puoi ottenere i soli nomi di access point che non sono già presenti nella lista, escludendo i "doppioni":
    
    SELECT DISTINCT nome_rete FROM tabella WHERE nome_rete NOT IN ( <lista_SSID>)
    
    Ovviamente la query che ti ho mostrato è solo un "template", devi poi sistemarla con i nomi e i valori di tuo interesse...


    il tuo consiglio ha funzionato

    ora ho un ultimo piccolo problema ma non riesco a capire se sono io ma non riesco proprio a correggerlo...
    Riguarda la mappa e il disegnare i marker...
    praticamente me li disegna solo che dovrebbe fare in rosso le reti protette ed in verde quelle free...
    a me disegna entrambe in tutte e due i modi fa che ne so alice-1234 rosso alice 1234 verde...
    come posso correggere? il codice è questo
    			 // Get a handle to the Map Fragment
    			GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    			hotspot = coordinates[i];
    			title = SSID[j];
    			sicurezza = Securities[k];
    			map.setMyLocationEnabled(true);
        		map.moveCamera(CameraUpdateFactory.newLatLngZoom(hotspot, 13));
    
    			
    			if(sicurezza.startsWith("[WPA-PSK-TKIP][WPA2-PSK-TKIP]") || sicurezza.startsWith("[WPA-PSK-TKIP]")){
    				
    	    		map.addMarker(new MarkerOptions().title(title)
    	    		    .snippet("Rete Privata protetta con chiave").position(hotspot));
    
    				}if(sicurezza.startsWith("[WPS]") || sicurezza.startsWith("[ESS]")){
    					
    
    					    		map.addMarker(new MarkerOptions().title(title)
    					    		    .snippet("Rete free").position(hotspot).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
    						}
    		} 
    		}
    
Devi accedere o registrarti per scrivere nel forum
31 risposte