Search code examples
androidsqliteandroid-cursor

How to use android SQLite cursors to show a row in the table


Don't ask questions here often but I have a MyDBHelper class with a method 'databaseToString' which I'm pretty sure is wrong but what I want to do is get the details that the user enters in the form which are stored in the 'details' table and output them in a seperate fragment/listview using cursors. (focus on one table for now) First of all I think my method 'databaseToString' is wrong as I want it to get what the user enters and display all the columns in a listview and secondly what do I do with this method so as to output the contents of the cursor to a new listview/fragment?

EDITED MyDBHelper class

package com.astuetz.viewpager.extensions.sample;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;

import java.util.ArrayList;
import java.util.List;

public class MyDBHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "detailsDB.db";
public static final String TABLE_DETAILS = "details";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_FIRSTNAME = "firstname";
public static final String COLUMN_SURNAME = "surname";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_EMAIL = "email";
public static final String COLUMN_ADDRESS1 = "address1";
public static final String COLUMN_ADDRESS2 = "address2";

public static final String TABLE_KIN_DETAILS = "kindetails";
public static final String COLUMN_KIN_ID = "_id";
public static final String COLUMN_KIN_YOUREMAIL = "youremailkin";
public static final String COLUMN_KIN_FIRSTNAME = "firstnamekin";
public static final String COLUMN_KIN_SURNAME = "surnamekin";
public static final String COLUMN_KIN_PHONE = "phonekin";
public static final String COLUMN_KIN_EMAIL = "emailkin";
public static final String COLUMN_KIN_ADDRESS1 = "address1kin";
public static final String COLUMN_KIN_ADDRESS2 = "address2kin";

// Pass database information along to superclass
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String query = " CREATE TABLE " + TABLE_DETAILS + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + COLUMN_FIRSTNAME + " TEXT, "
            + COLUMN_SURNAME + " TEXT, "
            + COLUMN_PHONE + " TEXT, "
            + COLUMN_EMAIL + " TEXT, "
            + COLUMN_ADDRESS1 + " TEXT, "
            + COLUMN_ADDRESS2 + " TEXT "
            + ");";

    String query2 = " CREATE TABLE " + TABLE_KIN_DETAILS + "("
            + COLUMN_KIN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + COLUMN_KIN_YOUREMAIL + " TEXT, "
            + COLUMN_KIN_FIRSTNAME + " TEXT, "
            + COLUMN_KIN_SURNAME + " TEXT, "
            + COLUMN_KIN_PHONE + " TEXT, "
            + COLUMN_KIN_EMAIL + " TEXT, "
            + COLUMN_KIN_ADDRESS1 + " TEXT, "
            + COLUMN_KIN_ADDRESS2 + " TEXT "
            + ");";
    db.execSQL(query);
    db.execSQL(query2);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(" DROP TABLE IF EXISTS " + TABLE_DETAILS);
    db.execSQL(" DROP TABLE IF EXISTS " + TABLE_KIN_DETAILS);
    onCreate(db);
}

//Add a new row to the database
public void addDetails(Details details) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_FIRSTNAME, details.getFirstname());
    values.put(COLUMN_SURNAME, details.getSurname());
    values.put(COLUMN_PHONE, details.getPhone());
    values.put(COLUMN_EMAIL, details.getEmail());
    values.put(COLUMN_ADDRESS1, details.getAddress1());
    values.put(COLUMN_ADDRESS2, details.getAddress2());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_DETAILS, null, values);
    db.close();
}


public void addKinDetails(KinDetails kinDetails){
    ContentValues values = new ContentValues();
    values.put(COLUMN_KIN_YOUREMAIL, kinDetails.getyourEmailkin());
    values.put(COLUMN_KIN_FIRSTNAME, kinDetails.getFirstnamekin());
    values.put(COLUMN_KIN_SURNAME, kinDetails.getSurnamekin());
    values.put(COLUMN_KIN_PHONE, kinDetails.getPhonekin());
    values.put(COLUMN_KIN_EMAIL, kinDetails.getEmailkin());
    values.put(COLUMN_KIN_ADDRESS1, kinDetails.getAddress1kin());
    values.put(COLUMN_KIN_ADDRESS2, kinDetails.getAddress2kin());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_KIN_DETAILS, null, values);
    db.close();
}



public List<Details> getAllDetails(){

    //create a new list in which we put all persons
    List<Details>detailsList = new ArrayList<>();

    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_DETAILS;

    //Cursor points to a location in your results
    Cursor c = db.rawQuery(query, null);
    //Move to the first row in your results

    if (c != null) {

        c.moveToFirst();

        //Position after the last row means the end of the results
        while (!c.isAfterLast()) {

            //create new details object
            Details details = new Details();

            //Here use static decalared on top of the class..dont use "" for the table column
            details.set_id(c.getColumnIndex(COLUMN_ID));
            details.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
            details.setSurname(c.getString(c.getColumnIndex(COLUMN_SURNAME)));
            details.setPhone(c.getString(c.getColumnIndex(COLUMN_PHONE)));
            details.setEmail(c.getString(c.getColumnIndex(COLUMN_EMAIL)));
            details.setAddress1(c.getString(c.getColumnIndex(COLUMN_ADDRESS1)));
            details.setAddress2(c.getString(c.getColumnIndex(COLUMN_ADDRESS2)));

            detailsList.add(details);


            c.moveToNext();
        }

        c.close();
    }

    db.close();

    //return our list of persons
    return detailsList;

}

}

Details class

package com.astuetz.viewpager.extensions.sample;


public class Details {
int _id;
String firstname;
String surname;
String phone;
String email;
String address1;
String address2;

// Empty constructor
public Details(String s){
}

public void set_id(int _id) {
    this._id = _id;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public void setSurname(String surname) {
    this.surname = surname;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public void setEmail(String email) {
    this.email = email;
}

public void setAddress1(String address1) {
    this.address1 = address1;
}

public void setAddress2(String address2) {
    this.address2 = address2;
}







public int get_id() {
    return _id;
}

public String getFirstname() {
    return firstname;
}

public String getSurname() {
    return surname;
}

public String getPhone() {
    return phone;
}

public String getEmail() {
    return email;
}

public String getAddress1() {
    return address1;
}

public String getAddress2() {
    return address2;
}
}

LOGCAT ERROR

Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length

Solution

  • The best approach is to create your custom objects to manage data for your example , create a new java file and name it Person, the following is the person class (for simplicity of code we do only 2 properties, you build yours completed with all the fields) :

    public class Person {
    
    //Properties
    private String _id;
    private String firstname;
    
    //Constructor
    public Person() {
    }
    
    
    //Getters and Setters
    public String get_id() {
        return _id;
    }
    
    public void set_id(String _id) {
        this._id = _id;
    }
    
    public String getFirstname() {
        return firstname;
    }
    
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    
    
    }
    

    Now this person object can be used from anywhere in your project, including send it to the dbHandler and getting from the dbHandler.

    For example to retrieve (not databaseToString , try to name methods more appropriately in the future) for example in the dbHandler :

    Update No 2

    /**
     * This method returns a list of persons objects
     * @return
     */
    public List<Person> getAllPersons(){
    
        //create a new list in which we put all persons 
        List<Person>personsList = new ArrayList<>();
    
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_DETAILS;
    
        //Cursor points to a location in your results
        Cursor c = db.rawQuery(query, null);
        //Move to the first row in your results
    
        if (c != null) {
    
            c.moveToFirst();
    
            //Position after the last row means the end of the results
            while (!c.isAfterLast()) {
    
                //create new person object
                Person person = new Person();
    
                //Here use static decalred on top of the class..dont use "" for the table column
                person.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
                person.set_id(c.getString(c.getColumnIndex(COLUMN_ID)));
    
                personsList.add(person);
    
                c.moveToNext();
            }
    
            c.close();
        }
    
        db.close();
    
        //return our list of persons
        return persons;
    
    }
    

    LOGCAT EDIT

    Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
    required: String
    found: no arguments
    reason: actual and formal argument lists differ in length