JavascriptProva

sabato 16 luglio 2016

Buttando giù un database per memorizzare date

Creare un database in cui venga memorizzata la data attuale.
Questo è il codice che ho trovato nella Palestra Database:
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Helper helper=new Helper(this);
  Date d=new Date();
  helper.save(d);

  Long numero=helper.query(5).getLong(1);
  Log.v("NUMERO",""+numero);
  DateFormat df=new SimpleDateFormat("hh:mm:ss");
  Log.v("DATA",df.format(new Date(numero)).toString());
  
  

  
 }
 
 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, data integer)");
   
  }
  
  public void save(Date d){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("data", d.getTime());
   db.insert("TABELLA", null, values);
  }
  
  public Cursor query(int numero){
   SQLiteDatabase db=this.getReadableDatabase();
   Cursor crs=db.rawQuery("select * from TABELLA where _id="+numero, null);
   crs.moveToFirst();
   return crs;
   
  }

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

}
Ecco, non ricordo praticamente niente.
Il campo in cui memorizzare la data è un Integer, e ricordo che in SQL un campo di tipo Integer può memorizzare anche un numero Long.
Perché memorizzare un numero long?
Fosse perché si mette il tempo in millisecondi dal 1 gennaio 1970?

Credo proprio di sì.
Analizziamo il codice...

Ho scritto agevolmente il codice per la creazione di un Database:
 class Helper extends SQLiteOpenHelper{

  public Helper(Context context) {
   super(context, "database.db", null, 1);
   // TODO Auto-generated constructor stub
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("create table TABELLA(_id integer primary key, date integer)");
   
  }
  
  public void save(int data){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("date", data);
   db.insert("TABELLA", null, values);
   
  }
  
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor crs=db.rawQuery("select * from tabella",null);
   crs.moveToFirst();
   Cursor c=crs;
   crs.close();
   return c;
   
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   
  }
  
 }
ma riguardando il codice precedente ho visto che il codice per la conversione a numero Long è presente all'interno dello stesso metodo save del database.
Risolto:
  public void save(Date data){
   SQLiteDatabase db=this.getWritableDatabase();
   
   ContentValues values=new ContentValues();
   values.put("date", data.getTime());
   db.insert("TABELLA", null, values);
   
  }
Vado a salvare e a verificare:
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Helper helper=new Helper(this);
  Date d=new Date();
  helper.save(d);
Sì, sono scritti dei numeri, che sarebbero i millisecondi dalla data chiamata Epoch.

Come si ricompongono in una data?

Si usa DateFormat.
Proviamo.
Definiamo un oggetto DateFormat.
  DateFormat df=new SimpleDateFormat("dd:MM:yyyy");
  Log.v("DATA", ""+df.format(new Date(numero)));
E vediamo:
07-16 20:50:26.622: V/DATA(15687): 16:07:2016
Perfetto!

Nessun commento:

Posta un commento