mardi 29 septembre 2015

Android not displaying data from database

I created a very simple application which allows the user to save emergency information into a database and then displays it on a different screen. The information the user can save is first name, blood type, contact number, phone number and relationship type.

However the problem is that the application is not displaying all of the information. It is only displaying the first name. I believe the cursor is not moving onto the next row, so I think the problem is in the code below:

    public String databaseToString(){
    String dbString = "";
    SQLiteDatabase db = getWritableDatabase();
    //Every Column and row
    String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";

    //Cursor points to a location in your results
    //First row point here, second row point here

    Cursor c = db.rawQuery(query, null);
    c.moveToFirst();

    while(!c.isAfterLast()){
        //Extracts first name and adds to string
        if(c.getString(c.getColumnIndex("firstName"))!=null){
            dbString += c.getString(c.getColumnIndex("firstName"));
            c.moveToNext();
            /*
             * Displaying all other columns 
             */
        }
    }
    db.close();
    return dbString;
}

Here is the full Code:

Database Class:

package com.example.androidsimpledbapp1;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;

public class MyDBHandler extends SQLiteOpenHelper {

/*
 * Class for Working with DB 
 */

//Update each time DB structure changes e.g. adding new property
private static final int DATABASE_VERSION =1;
//DB Name
private static final String DATABASE_NAME = "details.db";
//Table name
public static final String  TABLE_PRODUCTS = "products";
//DB Columns 
public static final String  COLUMN_ID = "_Id";
public static final String  COLUMN_PERSONNAME  = "firstName";
public static final String  COLUMN_PERSONBLOOD  = "bloodType";
public static final String  COLUMN_PERSONCONTACT  = "contactName";
public static final String  COLUMN_PERSONNUMBER  = "phoneNumber";
public static final String  COLUMN_PERSONRELATION = "relationship";

//Constructor
/*
 * Passing information to super class in SQL
 * Context is background information 
 * name of db 
 * Database version
 */
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

/*
 * What to do first time when you create DB
 * Creates the table the very first time
 * (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
 * Remember to use Commas as shown below
 */
@Override
public void onCreate(SQLiteDatabase db){
    String query = "CREATE TABLE "+ TABLE_PRODUCTS + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
            COLUMN_PERSONNAME + " TEXT, "+
            COLUMN_PERSONBLOOD + " TEXT, "+
            COLUMN_PERSONCONTACT + " TEXT, "+
            COLUMN_PERSONNUMBER + " TEXT, " +
            COLUMN_PERSONRELATION + " TEXT " +
            ");";
    //Execute the query
    db.execSQL(query);
}

/*
 * If ever upgrading DB call this method
 * (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
 */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    //Delete the current table
    db.execSQL("DROP TABLE IF EXISTS" + TABLE_PRODUCTS);
    //create new table 
    onCreate(db);
}

//Add new row to the database
public void addProduct(Details details){
    //Built in class - set values for different columns 
    //Makes inserting rows quick and easy
    ContentValues values = new ContentValues();
    values.put(COLUMN_PERSONNAME, details.get_firstName());
    values.put(COLUMN_PERSONBLOOD, details.get_bloodType());
    values.put(COLUMN_PERSONCONTACT, details.get_contactName());
    values.put(COLUMN_PERSONNUMBER, details.get_phoneNumber());
    values.put(COLUMN_PERSONRELATION, details.get_relationship());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_PRODUCTS, null, values);
    db.close();
}

/*Table was deleted*/
public void deleteProducts(){
    SQLiteDatabase db = getWritableDatabase();      
    db.delete(TABLE_PRODUCTS, null, null);
}

//Take DB and Convert to String 
public String databaseToString(){
    String dbString = "";
    SQLiteDatabase db = getWritableDatabase();
    //Every Column and row
    String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";

    //Cursor points to a location in your results
    //First row point here, second row point here

    Cursor c = db.rawQuery(query, null);
    c.moveToFirst();

    while(!c.isAfterLast()){
        //Extracts first name and adds to string
        if(c.getString(c.getColumnIndex("firstName"))!=null){
            dbString += c.getString(c.getColumnIndex("firstName"));
            c.moveToNext();
            /*
             * Displaying all other columns 
             */
        }
    }
    db.close();
    return dbString;
}
  }

Details Class:

package com.example.androidsimpledbapp1;

public class Details {

//primary key
private int _id;
//Properties 
private String _firstName;
private String _bloodType;
private String _contactName;
private String _phoneNumber;
private String _relationship;

//Dont Have to Enter Everything each time
public Details(){

}

public Details(String firstName){
    this.set_firstName(firstName);
}

//Passing in details 
//Setting values from the user 
public Details(String firstName, String bloodType,
        String contactName, String phoneNumber,
        String relationship){
    this.set_firstName(firstName);
    this.set_bloodType(bloodType);
    this.set_contactName(contactName);
    this.set_phoneNumber(phoneNumber);
    this.set_relationship(relationship);

}

//Retrieve the data 
public int get_id() {
    return _id;
}

//Setter allows to give property
public void set_id(int _id) {
    this._id = _id;
}

public String get_firstName() {
    return _firstName;
}

public void set_firstName(String _firstName) {
    this._firstName = _firstName;
}

public String get_bloodType() {
    return _bloodType;
}

public void set_bloodType(String _bloodType) {
    this._bloodType = _bloodType;
}

public String get_contactName() {
    return _contactName;
}

public void set_contactName(String _contactName) {
    this._contactName = _contactName;
}

public String get_phoneNumber() {
    return _phoneNumber;
}

public void set_phoneNumber(String _phoneNumber) {
    this._phoneNumber = _phoneNumber;
}

public String get_relationship() {
    return _relationship;
}

public void set_relationship(String _relationship) {
    this._relationship = _relationship;
}
}

Edit Screen - The screen where the user adds the data into the DB, upon pressing save the all the database information should display on the main activity

package com.example.androidsimpledbapp1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class EditScreen extends Activity {


EditText firstNameInput;
EditText bloodTypeInput;
EditText contacNameInput;
EditText phoneNumberInput;
EditText relationshipInput;
MyDBHandler dbHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_screen);
    //Setting EditTexts 
    firstNameInput = (EditText) findViewById(R.id.inputname);
    bloodTypeInput = (EditText) findViewById(R.id.inputblood);
    contacNameInput = (EditText) findViewById(R.id.inputcontact);
    phoneNumberInput = (EditText) findViewById(R.id.inputnum);
    relationshipInput = (EditText) findViewById(R.id.inputraltion);
    //Setting DbHandler object 
    dbHandler = new MyDBHandler(this, null, null, 1);

}

public void saveMe(View v){
    /*
     * Making a new object 
     * Object takes 5 parameters 
     */
    Details detail = new Details(firstNameInput.getText().toString(),
            bloodTypeInput.getText().toString(),
            contacNameInput.getText().toString(),
            phoneNumberInput.getText().toString(),
            relationshipInput.getText().toString());
    dbHandler.addProduct(detail);

    //Sending Text To Main Activity
    String dbString = dbHandler.databaseToString();
    Intent myIntent = new Intent(v.getContext(),MainActivity.class);
    myIntent.putExtra("mytext",dbString);
    startActivity(myIntent);
    //End of Sending to Main Activity


    //Setting the text in Edit Text
    firstNameInput.setText(dbString);
}


public void clearBtnPressed(View v){
    dbHandler.deleteProducts();
}
  }

MainActivity - This screen displays the data

package com.example.androidsimpledbapp1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;



public class MainActivity extends Activity {

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

    //Grabs the TextView 
    mTextView = (TextView)findViewById(R.id.dbname);
    mTextView.setText(getIntent().getStringExtra("mytext"));
}

//Changing Activity
public void editBtnPressed(View v){
    Intent intent = new Intent(MainActivity.this, EditScreen.class);
    startActivity(intent);
}

 }

Aucun commentaire:

Enregistrer un commentaire