Autore Topic: DB SQLite salva numeri e non stringhe di numeri  (Letto 597 volte)

Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
DB SQLite salva numeri e non stringhe di numeri
« il: 21 Maggio 2014, 12:39:07 CEST »
0
Ciao Ragazzi,
come da titolo ho un problema per il salvataggio in DB SQLite. Il problema è che in fase di realizzazione non avevo badato tanto a ciò ma adesso sembra tornarmi utile, ad oggi ho un'app che mi permette di recuperare le Coordinate e le salva in un DB SQLite sotto forma di STRINGA, adesso vorrei salvarle come numeri. Come posso modificare il DB SQLite in modo da avere numeri? Ho già provato a googlare e cercare nel forum ma non ho trovato la soluzione, ho provato a sbatterci la testa ma nulla.

Il codice ad oggi è:

Activity Dato.java
Codice (Java): [Seleziona]
package com.pup3770.localandsavegps;

public class Dato {
   
    private String latitudine;
    private String longitudine;
   
   
    public Dato(String latitudine, String longitudine) {
            super();
            this.latitudine = latitudine;
            this.longitudine = longitudine;

    }

    public String getLatitudine() {
            return latitudine;    
    }
   
   
    public String getLongitudine() {
        return longitudine;    
}
   
   
   
}

Activity AdapterDato.java
Codice (Java): [Seleziona]
package com.pup3770.localandsavegps;

import java.util.List;

import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


public class AdapterDato extends ArrayAdapter<Dato>{
   
    private int resource;
    private LayoutInflater inflater;
    private Context context;
   
   
    public AdapterDato (Context context, int resourceId,List<Dato> objects) {
         super(context, resourceId, objects);
         resource = resourceId;
         inflater = LayoutInflater.from(context);
         this.context = context;

     }

     @Override
     public View getView(int position, View v, ViewGroup parent) {

         // Recuperiamo l'oggetti che dobbiamo inserire a questa posizione
         Dato c = getItem(position);
         
         ViewHolder holder;

         if (v == null) {
                 
             // Layout che conterra' solamente la TextView txtnomeContatto
             int layout = R.layout.row_dato;
             
             v  = LayoutInflater.from(getContext()).inflate(layout, null);              
                 
             holder = new ViewHolder();
             holder.latitudineDato= (TextView) v.findViewById(R.id.txtlatitudineDato);    
             holder.longitudineDato= (TextView) v.findViewById(R.id.txtlongitudineDato);          

             v.setTag(holder);
         } else {
              holder = (ViewHolder) v.getTag();

         }
         
         holder.latitudineDato.setText(c.getLatitudine());
         holder.longitudineDato.setText(c.getLongitudine());

         
      return v;
       }        

     private static class ViewHolder {
        TextView latitudineDato;
        TextView longitudineDato;

      }
     
 
}


Activity DataBaseHelper.java:
Codice (Java): [Seleziona]
package com.pup3770.localandsavegps;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper {

        private static final String DATABASE_NAME = "coordinate";
        private static final int DATABASE_VERSION = 1;
       
        public DataBaseHelper(Context context) {
               
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
               
        }

        @Override
        public void onCreate(SQLiteDatabase db_coordinate) {
                // TODO Auto-generated method stub
               
                String create = "";
                create += "CREATE TABLE coordinate (";
                create += "  latitudine TEXT,";
                create += "  longitudine TEXT)";
                db_coordinate.execSQL(create);
               
                /*
                 * Esempi di inserimento dati nel DB
                ContentValues v = new ContentValues();
               
                v.put("nome", "Marco");
                v.put("cognome", "Marco");
                db.insert("rubrica", null, v);
               
                v = new ContentValues();
                v.put("nome", "Giorgio");
                v.put("cognome", "Marco");
                db.insert("rubrica", null, v);
               
                v = new ContentValues();
                v.put("nome", "Luigi");
                v.put("cognome", "Marco");
                db.insert("rubrica", null, v);
                */

        } //Fine OnCreate
       

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
        }
       
} //Fine Activity DataBaseHelper


Activity Coordinate.java:
Codice (Java): [Seleziona]
package com.pup3770.localandsavegps;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Coordinate extends Activity {

        DataBaseHelper db_coordinate;

       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
               

                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_coordinate);
                               
                 
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 
 
        boolean gps = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
 
        if (!gps) {
 
                new AlertDialog.Builder(this).setTitle("GPS Disabilitato").create().show();
 
 
                TextView providerText = (TextView) findViewById(R.id.provider_txt);
                providerText.setText("Sto usando la connessione dati");
 
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    60000, // 1 minute interval between updates
                    100, // 100 meters between updates
                    new LocationListener() {
 
                                        @Override
                                        public void onLocationChanged(Location location) {
 
                                        TextView latitudine = (TextView) findViewById(R.id.latitude_txt);
                                        TextView longitudine = (TextView) findViewById(R.id.longitude_txt);
 
                                        latitudine.setText("La latitudine è: "+String.valueOf(location.getLatitude()));
                                        longitudine.setText("La longitudine è: "+String.valueOf(location.getLongitude()));
                                        }
 
                                        @Override
                                        public void onProviderDisabled(String provider) {}
 
                                        @Override
                                        public void onProviderEnabled(String provider) {}
 
                                        @Override
                                        public void onStatusChanged(String provider, int status, Bundle extras) {}
 
            });
        } else {
 
                TextView providerText = (TextView) findViewById(R.id.provider_txt);
                providerText.setText("Sto usando il GPS");
 
 
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    20000, // 20 seconds interval between updates
                    100, // 100 meters between updates
                    new LocationListener() {


                                        @Override
                                        public void onLocationChanged(Location location) {

                                               
                                        TextView latitudine = (TextView) findViewById(R.id.latitude_txt);
                                        TextView longitudine = (TextView) findViewById(R.id.longitude_txt);
 
                                        latitudine.setText("La latitudine è: "+String.valueOf(location.getLatitude()));
                                        longitudine.setText("La longitudine è: "+String.valueOf(location.getLongitude()));
 

                                        db_coordinate = new DataBaseHelper(getApplicationContext());
                                 
                                        String latitudine_db = "";
                                        String longitudine_db = "";
                                        latitudine_db = String.valueOf(location.getLatitude());
                                        longitudine_db = String.valueOf(location.getLongitude());
                                       
                                        ContentValues v = new ContentValues();

                                        v.put("latitudine", latitudine_db);    
                                        v.put("longitudine", longitudine_db);
                                        db_coordinate.getWritableDatabase().insert("coordinate", null, v);

                                        Toast.makeText(getApplicationContext(), "Coordinate salvate correttamente", Toast.LENGTH_SHORT).show();
                                       
                                       
                                        }
 
                                        @Override
                                        public void onProviderDisabled(String provider) {}
 
                                        @Override
                                        public void onProviderEnabled(String provider) {}
 
                                        @Override
                                        public void onStatusChanged(String provider, int status, Bundle extras) {}
 
            });
        }

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.coordinate, menu);
                return true;
        }
       

       
        //Collegamento alla Activity "Coordinate" mediante pressione del bottone
                        public void ricavaCoordinate (View view){
                                 
                        Intent coordinate;
                 
                        coordinate = new Intent (this, Coordinate.class);
                 
                        startActivity(coordinate);
                        }
                       
                       
       
        //Collegamento alla Activity "ElencoCoordinate" mediante pressione del bottone

                        public void elencoCoordinate (View view){
                                 
                        Intent elenco;
                 
                        elenco = new Intent (this, ElencoCoordinate.class);
                 
                        startActivity(elenco);
                        }
       
                       
        //Collegamento alla Activity "Contatti" mediante pressione del bottone
                        public void visualizzaContatti (View view){
                                 
                        Intent contatti;
                 
                        contatti = new Intent (this, Contatti.class);
                 
                        startActivity(contatti);
                        }
                       
                       
        //Collegamento alla Activity "Homepage" mediante pressione del bottone
                        public void home (View view){
                                 
                        Intent homepage;
                 
                        homepage = new Intent (this, MainActivity.class);
                 
                        startActivity(homepage);

                        }
                       
                //Collegamento alla Activity "FormattaElenco" mediante pressione del bottone
                        public void formattaElenco (View view){
                                 
                        Intent formatta;
                 
                        formatta = new Intent (this, FormattaElenco.class);
                 
                        startActivity(formatta);
                        }

}

Come posso modificare? Avevo provato a modificare l'Activity "Dato.java" mettendo "double" al posto di "String" in modo da definire il dato come valore numerico e in quell'Activity non mi dava problemi ma poi quando utilizzo i metodi più avanti mi da errore, ma non riesco a capire quale altro metodo, e quindi come sostituire, devo utilizzare.

Grazie in anticipo

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #1 il: 22 Maggio 2014, 18:27:15 CEST »
0
Dovresti mettere integer al posto di text quando crei il DB.
Comunque se non sbaglio le coordinate hanno un valore del tipo x.y.z.h ....per cui ti conviene davvero memorizzarle come numeri?

Un bel Integer.parse("134") non può andare bene?
E relativo String.valueOf(134)

Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #2 il: 22 Maggio 2014, 22:13:52 CEST »
0
Grazie
Citazione
tonno16
per la risposta alla mia domanda, guarda ti spiego subito il mio problema. Sto cercando di andare a tentativi perché trovo poca documentazione, in pratica dovrei salvare questi dati in un database spaziale e poi gestirli solo che a quanto pare bisogna usare Spatialite che non è ben documentato. Quindi avevo pensato intanto di salvare come numeri le coordinate, non conosco cosa vuol dire fare:
Citazione
Un bel Integer.parse("134") non può andare bene?
E relativo String.valueOf(134)

In che file posso apportare la modifica che mi hai suggerito:
Citazione
Dovresti mettere integer al posto di text quando crei il DB.

? ? ?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #3 il: 22 Maggio 2014, 22:22:00 CEST »
0
Se sei agli inizi e non sai come usare un DB forse non è cosa facile gestire posizioni di coordinate.
Comunque nella classe databaseHelper se vedi hai una stringa CREATE database.... All'interno del metodo onCreate(). Al posto di text dovresti mettere integer. Comunque se vai ora a modificare avrai un errore. O trovi una query per settare il campo a INT oppure cambi la variabile databasename cosi facendo te ne crea un altro.

Se te hai due campi
Stringe a = "4"
String b ="5"
Se fai a+b ottieni 45.

Quindi
int a2 = Integer.parse(a)
int b2 = Integer.parse(b)

Ora int c = a2+b2 avrai c= 9.

Ti è chiaro?

Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #4 il: 22 Maggio 2014, 22:35:17 CEST »
0
Citazione
Se te hai due campi
Stringe a = "4"
String b ="5"
Se fai a+b ottieni 45.

Quindi
int a2 = Integer.parse(a)
int b2 = Integer.parse(b)

Ora int c = a2+b2 avrai c= 9

ah ok, perché nel primo caso il segno "+" fa da concatena mentre nel secondo caso è un'operazione algebrica, vero?

Quindi:
Codice (Java): [Seleziona]
@Override
        public void onCreate(SQLiteDatabase db_coordinate) {
                // TODO Auto-generated method stub
               
                String create = "";
                create += "CREATE TABLE coordinate (";
                create += "  latitudine TEXT,";
                create += "  longitudine TEXT)";
                db_coordinate.execSQL(create);
               
        } //Fine OnCreate

Quindi se ho capito bene dovrebbe essere convertito così se non ci devo fare operazioni con i valori nel DB ma devo solo salvarli e visualizzarli:
Codice (Java): [Seleziona]
@Override
        public void onCreate(SQLiteDatabase db_coordinate) {
                // TODO Auto-generated method stub
               
                String create = "";
                create += "CREATE TABLE coordinate (";
                create += "  latitudine INTEGER,";
                create += "  longitudine INTEGER)";
                db_coordinate.execSQL(create);
               
        } //Fine OnCreate

ed avrei potuto utilizzare sia "INTEGER" che "INT" (recuperato dal link: http://www.sqlite.org/lang_createtable.html)?

Se invece volessi utilizzare i valori salvati nel DB, tipo per sommare un valore con un altro dovrei:
Codice (Java): [Seleziona]
@Override
        public void onCreate(SQLiteDatabase db_coordinate) {
                // TODO Auto-generated method stub
               
                int a2 = Integer.parse(latitudine);
                int b2 = Integer.parse(longitudine);

                CREATE TABLE coordinate (a2, b2);

                db_coordinate.execSQL(create);
               
        } //Fine OnCreate
?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #5 il: 23 Maggio 2014, 00:24:02 CEST »
0
Ti consiglio di leggetti una guida da 0.
In quello che hai scritto non ce niente di corretto. Rischi di perdere 40 ore quando in 10 potresti studiare e produrre la tua app in solo 1 ora.
Quando memorizzò dati nel DB devi usare un ContentValues o comunque fare uso di query del tipo;
INSERT INTO tabella Values ('parametro')
Ora a memoria non ricordo

Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
Re:DB SQLite salva numeri e non stringhe di numeri
« Risposta #6 il: 24 Maggio 2014, 11:17:25 CEST »
0
Citazione
tonno16
scusa ma perché:
Citazione
Se te hai due campi
Stringe a = "4"
String b ="5"
Se fai a+b ottieni 45.

Quindi
int a2 = Integer.parse(a)
int b2 = Integer.parse(b)

Ora int c = a2+b2 avrai c= 9
cosa vuol dire per te?

Lasciando stare il codice scritto sotto ma credo che quanto scritto sopra sia stato interpretato correttamente da me.

Comunque, vorrei seguire il tuo consiglio, hai qualcosa da consigliarmi?