vendredi 27 février 2015

SQLite updating a row and updating listview created by cursor

I have a from that a user fills in and their data is stored in a row using SQLite, a cursor gets their details from the table and outputs it in a listView. I want the user to be able to fill in that form again so as to update their details and display the new details in the listview in replace of the old details that are there. What happens at the moment is that when the user updates their details (fills in form again) then another row is created and that new row is outputed in the along with the original in the listview.


MyDBHandler 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 {

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

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 declared on top of the class..don't 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;

}
}


DetailsAdapter class



package com.astuetz.viewpager.extensions.sample;

import android.content.Context;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.List;

public class DetailsAdapter extends ArrayAdapter<Details> {

private Context context;

//Constructor
public DetailsAdapter(Context context, int resource, List<Details> objects) {
super(context, resource, objects);

this.context = context;
}


//The get view is the most crucial part of the adapter, here the listview asks the
//adapter for the row to display

@Override
public View getView(int position, View row, ViewGroup parent) {

//Get an instance of the holder
Holder holder;


//Check if this is the first time creating this row for the listview
if (row == null){

//Row was null, need to get components from the row_details.xml
holder = new Holder();

//get the Android's layout inflater service which will read row_details.xml
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//Fill the row view with the xml layout file
row = inflater.inflate(R.layout.row_details, null);

//Fill the holder with the text view components
holder.textViewId = (TextView)row.findViewById(R.id.row_details_textview_id);
holder.textViewName = (TextView)row.findViewById(R.id.row_details_textview_name);
holder.textViewSurname = (TextView)row.findViewById(R.id.row_details_textview_surname);
holder.textViewPhone = (TextView)row.findViewById(R.id.row_details_textview_phone);
holder.textViewEmail = (TextView)row.findViewById(R.id.row_details_textview_email);
holder.textViewAddress1 = (TextView)row.findViewById(R.id.row_details_textview_address1);
holder.textViewAddress2 = (TextView)row.findViewById(R.id.row_details_textview_address2);

//attach the holder to the row
row.setTag(holder);

}else{

//row was created before! thus get the holder object from the row tag
holder = (Holder)row.getTag();
}


//At this point we have our row, either created from new or got it from the row tag object
//we can now fill the data

//get our object from the list which is in the position of the listview
//position is passed to the getView method by the listview



Details details = getItem(position);

holder.textViewId.setText("ID: " + details.get_id());
holder.textViewName.setText("Firstname: " + details.getFirstname());
holder.textViewSurname.setText("Surname: " + details.getSurname());
holder.textViewPhone.setText("Phone: " + details.getPhone());
holder.textViewEmail.setText("Email: " + details.getEmail());
holder.textViewAddress1.setText("Address1: " + details.getAddress1());
holder.textViewAddress2.setText("Address2: " + details.getAddress2());

//return to listview to show
return row;
}

//A holder will be responsible to hold the components to improve listview performance
//We replicate the components in the row_details.xml
private class Holder{

TextView textViewName;
TextView textViewId;
TextView textViewSurname;
TextView textViewPhone;
TextView textViewEmail;
TextView textViewAddress1;
TextView textViewAddress2;

}

}

Aucun commentaire:

Enregistrer un commentaire