JavascriptProva

martedì 16 febbraio 2016

Alleggerimento del codice con metodi statici di un'altra classe

Allestiamo il database, che dovrà avere i seguenti campi:
  1. _id
  2. etichetta
  3. categoria
  4. immagine
  5. tipo
  6. coordinata X
  7. coordinata Y
Prendo un modulo di classe a parte per la classe Helper che istanzia SQLiteOpenHelper.
public class Helper extends SQLiteOpenHelper{

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

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("create table tabella(_id integer primary key, etichetta text, categoria text, immagine blob, tipo text, coordX integer, coordY integer)");
 }
 
 public void save(JImage jImage){
  SQLiteDatabase db=this.getWritableDatabase();
  ContentValues values=new ContentValues();
  values.put("etichetta", jImage.etichetta);
  values.put("categoria", jImage.categoria);
  values.put("immagine", jImage.immagine);
  values.put("tipo", jImage.tipo);
  values.put("coordX", jImage.coordX);
  values.put("coordY", jImage.coordY);
  db.insert("tabella", null, values);
 }
 
 public Cursor query(){
  SQLiteDatabase db=this.getWritableDatabase();
  Cursor crs=db.rawQuery("select * from tabella where categoria='iniziale' ", null);
  return crs;
  
 }

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

}
Ho creato anche il tipo JImage su un altro modulo di classe:
public class JImage {
 public String etichetta;
 public String categoria;
 public byte[] immagine;
 public String tipo;
 public int coordX;
 public int coordY;
}
Ora nella classe principale mi devo creare una funzione che salvi i dati di un'immagine impacchettando tutto in una variabile di tipo JImage perché venga salvato nel database.
I dati di tipo String possono essere immessi direttamente, ma quelli di tipo byte[] o, nel database, blob, devono essere immessi a partire da un'immagine.
Per fare questo, al momento metto delle immagini in risorse.

Una volta messe in risorse, devo costruire una bitmap e poi ridurla a un array di bytes.
 private byte[] decodeImage(int id){
  BitmapFactory.Options opzioni=new BitmapFactory.Options();
  opzioni.inJustDecodeBounds=true;
  BitmapFactory.decodeResource(getResources(),id,opzioni);
  int fattore=1;
  while(opzioni.outWidth/fattore>100 && opzioni.outHeight/fattore>100){
   fattore*=2;
  }
  opzioni.inSampleSize=fattore;
  opzioni.inJustDecodeBounds=false;
  Bitmap bmp=BitmapFactory.decodeResource(getResources(),id,opzioni);

  ByteArrayOutputStream stream=new ByteArrayOutputStream();
  bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream);
  byte[] b=stream.toByteArray();
  return b;
 }
E allora, costruita questa funzione, posso poi inserire le altre più facilmente.

Mi viene in mente di cercare di alleggerire il mio modulo principale mediante la "dislocazione" di alcune funzioni in altri moduli.
Proviamo: creo un modulo di classe...

public class Funzioni {
 public static Bitmap BitmapFromResources(Context context,int id){
  BitmapFactory.Options opzioni=new BitmapFactory.Options();
  opzioni.inJustDecodeBounds=true;
  BitmapFactory.decodeResource(context.getResources(),id,opzioni);
  int fattore=1;
  while(opzioni.outWidth/fattore>100 && opzioni.outHeight/fattore>100){
   fattore*=2;
  }
  opzioni.inSampleSize=fattore;
  opzioni.inJustDecodeBounds=false;
  Bitmap bmp=BitmapFactory.decodeResource(context.getResources(),id,opzioni);
  return bmp;
 }

 public static byte[] BitmapToByteArray(Bitmap bmp){
  ByteArrayOutputStream stream=new ByteArrayOutputStream();
  bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream);
  byte[] b=stream.toByteArray();
  return b;
 }
}
Ecco: dopo alcuni tentativi ho creato una classe con dei metodi statici, che possano essere eseguiti senza dover istanziare la classe.
Ho sperimentato il primo metodo e funziona. Dalla classe dell'Activity principale eseguo questo codice:
ImageView imageView=new ImageView(this);
  imageView.setImageBitmap(Funzioni.BitmapFromResources(this, R.drawable.faciadecul));
  mainLayout.addView(imageView);
E ottengo così, fornendo come parametri il context (this) e l'indirizzo dell'immagine in risorse, una ImageView con l'immagine!

Nessun commento:

Posta un commento