JavascriptProva

venerdì 21 ottobre 2016

Primo trasferimento di SQLiteDatabase su Firebase!

Per ripasso

Codice per rinominare la "radice" del database:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DatabaseReference databaseReference=FirebaseDatabase.getInstance().getReference();
        databaseReference.setValue("Ciao, ciccio");


    }
Bene.
Ora provo, come da esempio a mettere una classe su un database.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        
        Persona persona=new Persona("Mario","Rossi");

        DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
        databaseReference.setValue(persona);




    }

    class Persona{
        public String nome;
        public String cognome;

        public Persona(String nome, String cognome){
            this.nome=nome;
            this.cognome=cognome;
        }
    }
Ho usato il metodo setValue del DatabaseReference.
Ma leggo che si può usare anche il metodo push.
Vediamolo...

Ecco sì: questo è perfetto:
public class MainActivity extends AppCompatActivity {

    Persona persona;
    DatabaseReference nuovo;

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


        DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
        persona=new Persona("Mario","Rossi");
        nuovo=databaseReference.push();
        nuovo.setValue(persona);
        persona=new Persona("Giuseppe","Verdi");
        nuovo=databaseReference.push();
        nuovo.setValue(persona);
        persona=new Persona("Antonello", "Il Pazzo");
        nuovo=databaseReference.push();
        nuovo.setValue(persona);





    }

    class Persona{
        public String nome;
        public String cognome;

        public Persona(String nome, String cognome){
            this.nome=nome;
            this.cognome=cognome;
        }
    }


}


Ora mi creo un semplice database SQLite e tramite una classe intermedia lo salvo in remoto.
Prima mi compilo il database SQLite sul cellulare.
public class MainActivity extends AppCompatActivity {

    Persona persona;
    DatabaseReference nuovo;
    Helper helper;
    Button button;
    Button buttonSave;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        helper=new Helper(this);
        //DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();

        button=(Button)findViewById(R.id.button2);
        buttonSave=(Button)findViewById(R.id.button3);



        buttonSave.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                persona=new Persona("Mario","Rossi",45,"Scassinatore");
                helper.save(persona);
                persona=new Persona("Carlo","Bianchi",54,"Ladro");
                helper.save(persona);
                persona=new Persona("Luigi","Verdi",36, "Falsario");
                helper.save(persona);
            }
        });
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Cursor c=helper.query();
                do{
                    System.out.println(c.getString(0)+" "+c.getString(1)+" "+c.getInt(2)+" "+c.getString(3));
                } while(c.moveToNext());
            }
        });
    }

}

class Persona{
    public String nome;
    public String cognome;
    public int eta;
    public String professione;
    public Persona(String nome, String cognome, int eta, String professione){
        this.nome=nome;
        this.cognome=cognome;
        this.eta=eta;
        this.professione=professione;
    }
}

class Helper extends SQLiteOpenHelper{

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE TABELLA(NOME TEXT, COGNOME TEXT, ETA INTEGER, PROFESSIONE TEXT)");
    }

    public void save(Persona p){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("NOME",p.nome);
        values.put("COGNOME",p.cognome);
        values.put("ETA",p.eta);
        values.put("PROFESSIONE",p.professione);
        db.insert("TABELLA",null,values);
    }

    public Cursor query(){
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor crs=db.rawQuery("SELECT* FROM TABELLA",null);
        crs.moveToFirst();
        return crs;
    }

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

    }
}
(qui ho commentizzato il codice relativo a Firebase perché adesso devo solo creare un database, il codice cambierà in seguito).

Perfetto: il database è stato creato e compilato correttamente, ne ho la conferma:
10-21 11:40:44.305 4257-4257/? I/System.out: Mario Rossi 45 Scassinatore
10-21 11:40:44.305 4257-4257/? I/System.out: Carlo Bianchi 54 Ladro
10-21 11:40:44.305 4257-4257/? I/System.out: Luigi Verdi 36 Falsario
Ora viene la parte "tosta"!

Devo prendere un Cursor dal mio database.
Per ogni RECORD devo fare un push e quindi un setValue, ossia aggiungere un NODO al database.
Quindi scorrere il Cursor, porre i valori in un'istanza della classe Persona e quindi fare push e settare Value all'istanza di Persona.
Traduciamo in codice l'idea...

        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Cursor c=helper.query();
                do{
                   persona=new Persona(c.getString(0),c.getString(1),c.getInt(2),c.getString(3));
                } while(c.moveToNext());
            }
        });
Ho creato un'istanza di Persona mettendo i valori dei campi come parametri del costruttore della classe.
Ora...
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Cursor c=helper.query();
                do{
                   persona=new Persona(c.getString(0),c.getString(1),c.getInt(2),c.getString(3));
                    DatabaseReference nodo=databaseReference.push();
                    nodo.setValue(persona);

                } while(c.moveToNext());
            }
        });
...questo dovrebbe funzionare. Vediamo...

ALLA GRANDE!!!

1 commento: