Vahalaru Vahalaru - 2 months ago 13
Android Question

How to call an Add Method in a Database Handler Class

Hey so this is my first post but I am absolutely stuck. Either I don't understand database (which i really am kinda slapping this together to try and learn) I have created a basic CRUD DBHandlerclass with a method to add a plane. and a Activity that allows the user to input the info to save to the database. I really appriciate any pointers, hints, or if you can show me a good tutorial. the tutorial that I used to build this database I found at http://mobilesiri.com/android-sqlite-database-tutorial-using-android-studio/

here is the DBHandler class.

public class DBHandler extends SQLiteOpenHelper {

//Database Version
private static final int DATABASE_VERSION = 1;
//Database Name
private static final String DATABASE_NAME = "avtoolsInfo";
//Plane info table name
private static final String TABLE_PLANES = "planeInfo";
// planes table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_TYPE = "type";
private static final String KEY_PLANE_CLASS = "plane_class";
private static final String KEY_FUEL_STYLE = "fuel_style";
private static final String KEY_NOTES = "notes";




public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_PLANE_TABLE = "CREATE TABLE " + TABLE_PLANES + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_TYPE + " TEXT," + KEY_PLANE_CLASS + " TEXT," + KEY_FUEL_STYLE + " TEXT," + KEY_NOTES + " TEXT" + ")";
db.execSQL(CREATE_PLANE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PLANES);
//Creating tables again
onCreate(db);
}

// Adding a new plane
public void addPlane(PlaneInfo planeInfo)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, planeInfo.getName()); //plane name
values.put(KEY_TYPE, planeInfo.getType()); //plane type
values.put(KEY_PLANE_CLASS, planeInfo.getPlaneClass()); //plane class
values.put(KEY_FUEL_STYLE, planeInfo.getFuelStyle());//plane fuel style
values.put(KEY_NOTES, planeInfo.getNotes());//plane notes
// Inserting Row
db.insert(TABLE_PLANES, null, values);
// Closeing Database
db.close();


Here is the activity to add. [edit. this is the layout file]

<?xml version="1.0" encoding="utf-8"?>




<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="60dp">

<android.support.design.widget.TextInputLayout
android:id="@+id/input_layout_plane_name"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/input_plane_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/plane_name"
android:maxLines="1" />

</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
android:id="@+id/input_plane_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/input_layout_plane_name">

<EditText
android:id="@+id/plane_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/plane_type" />

</android.support.design.widget.TextInputLayout>

<TextView
android:id="@+id/plane_class_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/input_plane_type"
android:layout_alignParentLeft="true"
android:text="@string/plane_class_textview"/>

<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/plane_class_text"
android:layout_below="@id/input_plane_type"
></Spinner>

<TextView
android:id="@+id/fuel_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/spinner"
android:text="@string/fueling_type_textview"/>
<Spinner
android:id="@+id/spinner2"
android:layout_below="@id/spinner"
android:layout_toRightOf="@id/fuel_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content">


</Spinner>





<Button
android:id="@+id/save_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="@string/save_button"
android:onClick="addPlane"/>

<android.support.design.widget.TextInputLayout
android:id="@+id/input_plane_notes"
android:layout_alignParentBottom="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/spinner2"
android:layout_above="@id/save_button">

<EditText
android:id="@+id/plane_notes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/plane_user_notes" />

</android.support.design.widget.TextInputLayout>

</RelativeLayout>




I really apriciate all the help.

[edit here is the add class]

package com.example.jerem.avtools;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.graphics.drawable.DrawerArrowDrawable;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class AddNewPlane extends AppCompatActivity {

Spinner spinner2;
Spinner spinner;
ArrayAdapter<CharSequence> adapter;
ArrayAdapter<CharSequence> adapter2;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_new_plane);
spinner = (Spinner) findViewById(R.id.spinner);
adapter = ArrayAdapter.createFromResource(this,R.array.plane_class_spinner_data,android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

Toast.makeText(getBaseContext(),parent.getItemAtPosition(position)+" is selected",Toast.LENGTH_SHORT).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});

spinner2 = (Spinner) findViewById(R.id.spinner2);
adapter2 = ArrayAdapter.createFromResource(this,R.array.fueling_styles,android.R.layout.simple_spinner_item);
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapter2);
}
}

Answer

I feel like that link shows how to use that class... Anyways, here

public class AddNewPlane extends AppCompatActivity {

    Spinner spinner2;
    Spinner spinner;
    ArrayAdapter<CharSequence> adapter;
    ArrayAdapter<CharSequence> adapter2;

    DBHandler dbHandler; // add field

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

        dbHandler = new DbHandler(this); // initialize

  } 

    public void addPlane(View view) {
        PlaneInfo plane = new PlaneInfo();

        EditText edtPlaneType = (EditText) findViewById(R.id.plane_type);
        plane.setType(edtPlaneType.getText().toString());

        // TODO: Set more properties

        dbHandler.addPlane(plane);
    }
}

Regarding the id value, you should return the result of the insertion of the database handler. That will return the row number of the inserted record. You then can set the ID value on the PlaneInfo object from that.