JavascriptProva

martedì 25 aprile 2017

Programma per i successivi esercizi:
  1. Ricostruire l'activity per l'aggiunta di records nel database con immagine e edittext
  2. Addestrarsi all'uso del NumberPicker
  3. Allineamento nel LinearLayout

Esercizio ripetuto di ripasso dei Menu.



Altri esercizi sui database

Esercizio:
1) Eliminazione di un record da una tabella
2)Modifica di un campo di un record.

public class MainActivity extends AppCompatActivity {

    Helper helper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        

        /

        Cursor crs=helper.query();
        do{
            System.out.println(crs.getString(crs.getColumnIndex("nome"))+" "+crs.getString(crs.getColumnIndex("cognome")));
        }while(crs.moveToNext());

    }

}

class Helper extends SQLiteOpenHelper {

    public Helper(Context context) {
        super(context, "database.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table tabella(_id integer primary key, nome text, cognome text)");
    }

    public void save(String n, String c){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("nome",n);
        values.put("cognome",c);
        try {
            db.insertOrThrow("tabella", null, values);
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }
    }



    public Cursor query(){
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor crs=db.rawQuery("select*from tabella",null);
        crs.moveToFirst();
        return crs;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
Inseriamo la funzione che modifica:
    public void save(String n, String c){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("nome",n);
        values.put("cognome",c);
        try {
            db.insertOrThrow("tabella", null, values);
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }
    }
    
    public void modifica(String vecchio,String nuovo){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set nome='"+nuovo+"' where nome='"+vecchio+"'");
    }
Ora lo metto in opera:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica("Giuseppe","Pippo");

        
Vediamo...

04-25 14:57:01.773 6034-6034/? I/System.out: Mario Rossi
04-25 14:57:01.773 6034-6034/? I/System.out: Mario Verdi
04-25 14:57:01.774 6034-6034/? I/System.out: Pippo Verdi
Ricordare che il comando SQL inizia con UPDATE tabella, e poi SET... WHERE non è difficile.

Ora scrivo una procedura per eliminare il terzo record.
Provo con questa (nella classe Helper):
    public void cancella(String n){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where nome='"+n+"'");
    }
E la provo:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.cancella("Giuseppe");
Ecco:
04-25 15:03:58.850 9661-9661/? I/System.out: Mario Rossi
04-25 15:03:58.850 9661-9661/? I/System.out: Mario Verdi
Ancora con un altro nome. Riscrivo daccapo per allenarmi:
    public void cancella(String c){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where cognome='"+c+"'");
    }
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.cancella("Rossi");
04-25 15:07:32.736 11681-11681/? I/System.out: Mario Verdi
04-25 15:07:32.736 11681-11681/? I/System.out: Giuseppe Verdi


Operazione combinata di modifica e cancella. Modifico Giuseppe Verdi in Giuseppe Rossi e poi cancello Verdi.
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='Rossi' where nome='Giuseppe'");
    }

    public void cancella(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where cognome='Verdi'");
    }
Provo:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica();
        helper.cancella();
04-25 15:14:49.741 15579-15579/? I/System.out: Mario Rossi
04-25 15:14:49.741 15579-15579/? I/System.out: Giuseppe Rossi
perfetto!

Doppia modifica:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia' and nome='Cicciobello' where nome='Giuseppe'");
    }
No, ottengo uno zero.
Provo così:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia', nome='Cicciobello' where nome='Giuseppe'");
    }
04-25 15:19:57.107 18596-18596/? I/System.out: Mario Rossi
04-25 15:19:57.108 18596-18596/? I/System.out: Mario Verdi
04-25 15:19:57.108 18596-18596/? I/System.out: Cicciobello La Minchia
Perfetto!

Due clausole:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia' where nome='Mario' and cognome='Rossi'");
    }
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica();
04-25 15:47:10.068 519-519/? I/System.out: Mario La Minchia
04-25 15:47:10.069 519-519/? I/System.out: Mario Verdi
04-25 15:47:10.069 519-519/? I/System.out: Giuseppe Verdi
Okay.

Esercizi sui database

Rifaccio gli esercizi sui database.

1) Inserire diversi records con i campi nome e cognome, in cui vi sia il vincolo di cognome unico, e l'inserimento di records con cognome ripetuto determini la comparsa di un messaggio di errore in LogCat.

2) Inserire record in cui il vincolo sia soltanto di nome e cognome ambedue ripetuti, sempre con segnalazione dell'errore in LogCat.

3)Modificare il nome di uno o più records.
CREAZIONE GENERALE DI UN SEMPLICE DATABASE.
CREAZIONE DI UN VINCOLO DI UNICITA'.
Se viene lasciato insert al posto di insertOrThrow, l'inserimento del record viene semplicemente ignorato senza segnalare alcun errore.

Se insert viene sostituito con insertOrThrow l'errore viene rilevato e il programma si interrompe.
Se invece "catturo" l'errore con un ciclo try...catch, il programma viene eseguito e l'errore può essere gestito con la comparsa di un messaggio nel quale figura anche il campo responsabile dell'errore, cosa che mi permette di avvisare l'utente circa l'errore e la sua causa.
VINCOLO DI UNICITA' DELLA COMBINAZIONE DI PIU' CAMPI DELLA TABELLA

MODIFICA DEL VALORE DI UN CAMPO DELLA TABELLA

mercoledì 19 aprile 2017

Creazione di funzioni separate per la conversione Uri-Path, Path-Bitmap e Bitmap-Stringa

Ora voglio rendere funzione autonoma la conversione del Path in Bitmap e di questa in Stringa.
Innanzitutto che parametro bisogna avere per ottenere il Path dall'Uri restituito da data.getData()?
La funzione deve restituire una String e avere come parametro un Uri.
Proviamo...
    private String UriToPath(Uri foundUri){
        Cursor crs=getApplicationContext().getContentResolver().query(foundUri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s=crs.getString(indice);
        return s;
    }
Dovrebbe funzionare.

Ora vediamo per la trasformazione del Path in Bitmap.
La funzione restituisce Bitmap, e deve avere come parametro Path.
    private Bitmap PathToBitmap(String path){
        Bitmap bmp= BitmapFactory.decodeFile(path);
        return bmp;
    }
C'era un modo per ricavare bmp più piccole e meno pesanti, e su quello mi devo esercitare dopo perché non sono sicuro di ricordarlo a memoria.

Ora la funzione che ha per tipo String e per parametro Bitmap per la trasformazione di Bitmap in una String.
    private String BitmapToString(Bitmap bmp){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b =stream.toByteArray(b);
        String s= Base64.encodeToString(b,Base64.DEFAULT);
        return s;
    }
Ora mettiamole in sequenza facendo scrivere la sringa in LogCat.
Sì, ho testato funzione per funzione e funzionano tutte.
Potrei tenere una libreria per la conversione, da inserire in ogni mio programma per il quale ce ne fosse l'utilità.

martedì 18 aprile 2017

Prendendo il Cursor dalla tabella del database, vorrei fare di ognuno un'immagine.
Per disporre una griglia di immagini, indipendentemente dal contenuto, devo avere:
  • il numero degli elementi
  • la lunghezza delle linee.
Però per mettere poi in ognuna delle immagini l'immagine giusta devo avere preventivamente un array di immagini. Se voglio metterci anche i tags devo avere un array di tags.
Se voglio questa funzione dal resto, posso creare un arraylist di immagini e tags e quindi disporla come parametro, usando il size dell'arraylist.
Il vantaggio è che ho una funzione separata e quindi più gestibile e più facile da revisionare.
Lo svantaggio è che devo prima trasferire i valori dei campi del Cursor in un arrayList.
Proviamo...
                //PRENDERE TUTTI I RECORDS
                Cursor crs=helper.query();

                    ArrayList<imgStorage> imgStorageArrayList=new ArrayList<imgStorage>();
                do{
                    imgStorageArrayList.add(new imgStorage(crs.getString(2),crs.getString(2)));
                }while(crs.moveToNext());
                System.out.println(imgStorageArrayList.size()); 
Funziona.
Ora devo creare la funzione a parte, che avendo questo array come parametro crea le immagini.
            private void disponi(ArrayList<imgStorage> arrayStorage,int rowlength){
                for(int i=0;i<arrayStorage.size();i++){
                    imageView=new ImageView(getApplicationContext());
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(100,100);
                    params.leftMargin=i%rowlength*100;
                    params.topMargin=i/rowlength*100;
                    imageView.setLayoutParams(params);
                    mainLayout.addView(imageView);
                    imageView.setTag(arrayStorage.get(i).getNome());
                    System.out.println(arrayStorage.get(1).getNome());
                }
            } 
e sembra funzionare egregiamente.

domenica 16 aprile 2017

Esercizio su scelta di un'immagine dal contentprovider, trasformazione in stringa e ritrasformazione in bitmap

Prendere un'immagine dalla memoria e trasformarla in stringa.
Ecco tutto l'esercizio: trasformata in stringa e poi ritrasformata in bitmap in modo da farla apparire nell'ImageView.
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200);
        params.leftMargin=200;
        params.topMargin=0;
        imageView.setLayoutParams(params);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setData(Uri.parse("content://media/external/images/media"));
                startActivityForResult(intent,0);
            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            Cursor crs=getApplicationContext().getContentResolver().query(data.getData(),null,null,null,null);
            crs.moveToFirst();
            int index=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            String s=crs.getString(index);
            bmp= BitmapFactory.decodeFile(s);
            ByteArrayOutputStream stream=new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
            byte[] b=stream.toByteArray();
            String strImage= Base64.encodeToString(b,Base64.DEFAULT);
            System.out.println(strImage);
            byte[] c=Base64.decode(strImage,Base64.DEFAULT);
            bmp=BitmapFactory.decodeByteArray(c,0,c.length);
            imageView.setImageBitmap(bmp);
        }

sabato 15 aprile 2017

Esercizio sulla selezione di contenuti dal ContentProvider e sul ricavare il Path dall'Uri

Vediamo come si risale dall'URI al Path, e quindi prendere l'immagine dal Path.

Bisogna andare su ContentResolver.
Intanto creiamo un "imagepicker".
Uri dovrebbe essere l'indirizzo di una tabella che forse appartiene a qualcosa chiamato ContentProvider.
E vediamo che è 'sto ContentProvider.

Un'idea l'ho avuta: qui c'è solo da imparare a memoria gli URI, salvo creare dei ContentProvider, cosa che è ancora tutta da imparare.
Mi sono scordato TUTTO sull'uso dell'Intent per selezionare una risorsa da un ContentProvider mediante l'URI.
E quante volte mi devo esercitare?
Finora questo, ricostruito faticosamente, mi è riuscito:
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200);
        params.leftMargin=0;
        params.topMargin=200;
        imageView.setLayoutParams(params);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setData(Uri.parse("content://media/external/images/media"));
                startActivityForResult(intent,0);
            }
        });





    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            System.out.println(data.getData());
        }
    }
}
Ma non è ancora sufficiente.
Ho ottenuto l'URI, ma non il Path.
Ammettiamo che ci sia una tabella con tante colonne, una che sia ID, altre ancora fra cui una che sia il PATH della risorsa.
public class MainActivity extends AppCompatActivity { Bitmap bmp; ImageView imageView; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=(ImageView)findViewById(R.id.imageView); RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200); params.leftMargin=0; params.topMargin=200; imageView.setLayoutParams(params); button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent=new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(Uri.parse("content://media/external/images/media")); startActivityForResult(intent,0); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if(resultCode==RESULT_OK){ System.out.println(data.getData()); } } } Per arrivare al PATH dobbiamo entrare nella tabella con il ContentResolver fornendo l'URI, in modo che ci riposizioniamo sul record, quindi dobbiamo trovare la colonna nella quale vi sia il PATH.
Il nome della colonna (ossia del campo) mi resta misterioso. E devo impararlo a memoria.
Ora provo a desumermi il PATH in questo modo.
Innanzitutto devo ottenere sotto forma di Cursor il record corrispondente all'URL:
Cursor crs=getApplicationContext().getContentResolver().query(data.getData(),null,null,null,null);
Quindi trovare il numero della colonna dove è conservato il PATH (che è da imparare a memoria, almeno per il momento, dato che mi sfuggono completamente i criteri):
            crs.moveToFirst();
            int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
E quindi ricavare la stringa presente in quel numero di colonna:
String s=crs.getString(indice);

L'accesso alla risorsa sarà sempre fatto tramite l'Uri.


Ora, partendo da questo scheletro, riscrivere tutto:
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

            }
        });
        
    }
}
compresi dimensioni e posizione dell'imageView in fondo a destra.
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200);
        params.leftMargin=200;
        params.topMargin=0;
        imageView.setLayoutParams(params);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setData(Uri.parse("content://media/external/images/media"));
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            Cursor crs=getApplicationContext().getContentResolver().query(data.getData(),null,null,null,null);
            crs.moveToFirst();
            int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            String s=crs.getString(indice);
            System.out.println(s);
        }
    }
}
Ho corretto la posizione dell'immagine perché avevo usato rightMargin e bottomMargin ma l'immagine mi veniva posizionata in alto a sinistra piuttosto che in basso a destra.
Per il resto è tutto stato scritto correttamente.

venerdì 14 aprile 2017

Esercizio di conversione di immagine in array di bytes e quindi in stringa con procedimento inverso

Ora, convertita l'immagine in un array di byte, bisogna convertire questo in una stringa.
Ecco l'esercizio di conversione a stringa e riconversione a immagine:
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        bmp= BitmapFactory.decodeResource(getResources(),R.drawable.android);


        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b=stream.toByteArray();
        String s= Base64.encodeToString(b,Base64.DEFAULT);

        byte[]c=Base64.decode(s,Base64.DEFAULT);
        bmp=BitmapFactory.decodeByteArray(c,0,c.length);
        imageView.setImageBitmap(bmp);




    }
}