JavascriptProva

giovedì 4 agosto 2016

Immissione e feedback delle frasi immesse in un database.

Creare un database di frasi con possibilità di inserire nuovi record digitando in una EditText, mostrarli in una ScrollView e cancellarli mediante un pulsante.

Ho questo file di layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.palestrascrollview.MainActivity" >
 

</RelativeLayout> 
Devo aggiungere una ScrollView che contiene un Layout. Scelgo un LinearLayout.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.palestrascrollview.MainActivity" >
 <ScrollView
     android:id="@+id/scrollView"
     android:fillViewport="true"
     android:layout_width="400dp"
     android:layout_height="100dp"
     android:layout_alignParentTop="true"
     android:layout_alignParentLeft="true">
     <LinearLayout
                android:orientation="vertical"
         android:id="@+id/scrollLayout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="#afc" />
 </ScrollView>

</RelativeLayout> 
Bene: ho ottenuto un quadrato di colore verdino-azzurro (quello da me voluto), che dovrebbe comportarsi come una scrollView.
Ma vorrei aggiungervi anche altre cosette.
Una EditText e un pulsante per l'immissione.

Sono giunto a una soluzione ragionevole, usando LinearLayout, che al momento preferisco rispetto ai RelativeLayout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.palestrascrollview.MainActivity" >
    
 <LinearLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >
     
     <ScrollView
            android:id="@+id/scrollView"
            android:layout_width="400dp"
            android:layout_height="150dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:fillViewport="true" >

            <LinearLayout
                android:id="@+id/scrollLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#afc"
                android:orientation="vertical" />
        </ScrollView>

 </LinearLayout>
 
 <LinearLayout
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >

     <EditText
         android:id="@+id/editText1"
         android:layout_marginTop="30dp"
         android:layout_width="400dp"
         android:layout_height="wrap_content"
         android:ems="10" >

     <requestFocus />
 </EditText>
 
 <Button
     android:id="@+id/button1"
     android:layout_marginTop="30dp"
     android:layout_marginLeft="30dp"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Button" />    
 </LinearLayout>
 
</LinearLayout> 
Adesso occupiamoci del codice...

Ho creato un codice per una classe atta a generare il Database:
public class MainActivity extends Activity {

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

 }
 
 class Helper extends SQLiteOpenHelper{

  Context context;
  public Helper(Context context) {
   super(context, "database.db", null, 1);
   this.context=context;
  }
  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABELLA(TESTO TEXT)");
   
  }
  
  public void save(String frase){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("TESTO", frase);
   db.insert("TABELLA", null, values);
  }
  
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor crs=db.rawQuery("SELECT * FROM TABELLA", null);
   return crs;
   
   
  }
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   
  }
  
 }


}
Ora devo lavorare per l'immissione dei dati nel database, usando EditText e il Button.
Al momento ho trovato questo:
public class MainActivity extends Activity {

 EditText editText;
 Button button;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  final Helper helper=new Helper(this);
  editText=(EditText)findViewById(R.id.editText1);
  button=(Button)findViewById(R.id.button1);
  
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    helper.save(editText.getText().toString());

    
    
   }
  });

 }
I dati mi risultano regolarmente immessi nel database.
Ora devo pensare a un modo di visualizzarli immediatamente nella ScrollView.
Per il momento mi visualizzo la frase in LogCat per vedere che sia tutto a posto:
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    helper.save(editText.getText().toString());
    frase=helper.query().getString(2);
    Log.d("FRASE", frase);
    
   }
  });
Ottengo un errore IndexOutOfBound, e mi viene in mente che ho dimenticato il MoveToFirst...
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor crs=db.rawQuery("SELECT * FROM TABELLA", null);
   crs.moveToFirst();
   return crs;
   
   
  }
Un'altra correzione per l'errore del numero di colonna nel metodo getString dell'oggetto query():
   @Override
   public void onClick(View v) {
    helper.save(editText.getText().toString());
    frase=helper.query().getString(1);
    Log.d("FRASE", frase);
    
   }
e la cosa riesce!
Ora voglio estrarre, però, non solo il primo record del Cursor, ma tutti:
   @Override
   public void onClick(View v) {
    helper.save(editText.getText().toString());
    Cursor c=helper.query();
    do{
     Log.d("frase", c.getString(1));
    }while(c.moveToNext());
    
   }
Vediamo...

08-04 10:42:22.708: D/frase(8361): cvgfddghjjjjjjjhvvcfdsdhhjk
08-04 10:42:22.708: D/frase(8361): sddfffggg
08-04 10:42:22.708: D/frase(8361): ciao
08-04 10:42:22.708: D/frase(8361): ciccia
08-04 10:42:22.708: D/frase(8361): fgggggggggg
08-04 10:42:22.708: D/frase(8361): ciccio bello non scassare LA minchia
Perfetto!

Nessun commento:

Posta un commento