Android SQLite cursor/adapter cannot get data from database - android

I have a gridview class here:
<?xml version="1.0" encoding="utf-8"?>
<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:background="#color/colorPrimaryDark"
tools:context=".MainActivity">
<LinearLayout
android:id="#+id/topContent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="7">
<TextView
android:id="#+id/textView0"
android:background="#color/white"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="ID: "
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView1"
android:background="#color/purple"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridCode"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView2"
android:background="#color/green"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridDay"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView3"
android:background="#color/orange"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridStart"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView4"
android:background="#color/blue"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridDuration"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView5"
android:background="#color/yellow"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridType"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
<TextView
android:id="#+id/textView6"
android:background="#color/red"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/gridRoom"
android:textSize="18sp"
android:textColor="#color/black"
android:gravity="center"
/>
</LinearLayout>
<GridView
android:id="#+id/gridTable"
android:layout_below="#+id/topContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="10dip"
android:verticalSpacing="15dip"
android:stretchMode="columnWidth"
android:gravity="center"
android:numColumns="7"
android:background="#color/colorPrimary"
android:textSize="14sp"
>
</GridView>
</RelativeLayout>
and a database helper:
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper
{
//database information
public static final String DATABASE_NAME = "timetable.db";
public static final String TABLE_NAME = "timetable_data";
//the data each column will store
public static final String COL_1 = "ID";
public static final String COL_2 = "CODE";
public static final String COL_3 = "DAY";
public static final String COL_4 = "START";
public static final String COL_5 = "DURATION";
public static final String COL_6 = "TYPE";
public static final String COL_7 = "ROOM";
//construct the database
public DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, 1);
}
#Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,CODE TEXT,DAY TEXT,START TEXT,DURATION TEXT,TYPE TEXT,ROOM TEXT)");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
public boolean insertData(String code, String day, String start, String duration, String type, String room)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,code);
contentValues.put(COL_3,day);
contentValues.put(COL_4,start);
contentValues.put(COL_5,duration);
contentValues.put(COL_6,type);
contentValues.put(COL_7, room);
long result = db.insert(TABLE_NAME,null,contentValues);
if(result == -1)
return false;
else
return true;
}
public Cursor getAllData()
{
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("select * from "+TABLE_NAME,null);
return data;
}
public Integer deleteEntry(String id)
{
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME,"ID = ?", new String [] {id});
}
}
I'm trying to populate this gridview with data stored in the database, everything compiles fine, but in the app i get an error saying that data from Col-1 (the id column) cannot be retrieved.
this is the gridviewactivity.java class mentioned in the above code:
public class GridViewActivity extends MainActivity
{
private GridView gridTable;
private ArrayList<String> moduleList;
private ArrayAdapter<String> adapter;
private Cursor data;
DatabaseHelper timetableDB;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); setContentView(R.layout.gridview);
//GridView
gridTable=(GridView) findViewById(R.id.gridTable);
String id, code, day, time, duration, type, room;
id = ""; code = ""; day = ""; time = "";
duration = ""; type = ""; room = "";
timetableDB = new DatabaseHelper(getBaseContext());//getting the context object
timetableDB.getAllData();
try
{
//for holding retrieve data from query and store in the form of rows
Cursor data=timetableDB.getAllData();
moduleList = new ArrayList<>();
//Move the cursor to the first row.
if(data.moveToFirst())
{
do
{
id = data.getString(data.getColumnIndex ("id"));
code = data.getString(data.getColumnIndex ("code"));
day = data.getString(data.getColumnIndex ("day"));
time = data.getString(data.getColumnIndex ("time"));
duration = data.getString(data.getColumnIndex ("duration"));
type = data.getString(data.getColumnIndex ("type"));
room = data.getString(data.getColumnIndex ("room"));
//add in to array list
moduleList . add(id);
moduleList . add(code);
moduleList . add(day);
moduleList . add(time);
moduleList . add(duration);
moduleList . add(type);
moduleList . add(room);
}
while(data.moveToNext());//Move the cursor to the next row.
adapter = new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_item,moduleList);
gridTable.setAdapter(adapter);
}
else
{
Toast.makeText(getApplicationContext(),
"No data found", Toast.LENGTH_LONG).show();
}
}catch(Exception e)
{
Toast.makeText(getApplicationContext(),
"No data found "+e.getMessage(), Toast.LENGTH_LONG).show();
}
timetableDB.close();
}
}
am i using the cursor correctly in this class?
thanks!

am i using the cursor correctly in this class?
Yes, but problem is creating ArrayAdapter in wrong place.
Create object of ArrayAdapter after adding all items in moduleList ArrayList from Cursor.like:
do{
// add items in moduleList
}
while(data.moveToNext());//Move the cursor to the next row.
// create ArrayAdapter object here:
adapter = new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_item,moduleList);
// call setAdapter
gridTable.setAdapter(adapter);

The "id" column doesn't exist.
When you're creating the database you're using "ID" as the column name and not "id" so when you're calling data.getString(data.getColumnIndex("id")); it won't be able to find the column.

Related

how populate textview with specific column/row from sqlite database

how to get a data in KEY_NAME from my database(in DbHelper) into TextView("txtSchedName")? and after i retrieve the name its ID will also display in TextView("txtID")?
DbHelper
package com.example.dn;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DbHelper extends SQLiteOpenHelper {
static String DATABASE_NAME="patientdata";
public static final String TABLE_NAME="patient";
public static final String KEY_ID="id";
public static final String KEY_NAME="pname";
public static final String KEY_AGE="page";
public static final String KEY_GENDER="pgender";
public static final String KEY_ADDRESS="paddress";
public static final String KEY_CONTACT="pcontact";
private SQLiteDatabase mDb;
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY, " +
""+KEY_NAME+" TEXT, "+KEY_AGE+" TEXT, "+KEY_GENDER+" TEXT, "+KEY_ADDRESS+" TEXT, "+KEY_CONTACT+" TEXT)";
db.execSQL(CREATE_TABLE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
public void openDataBase() {
//Open the database
String myPath = DATABASE_NAME + TABLE_NAME;
SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
//latest created
public Cursor displayPatient() {
Cursor mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,
KEY_NAME,KEY_AGE,KEY_CONTACT,KEY_GENDER,KEY_ADDRESS},
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToLast();
}
return mCursor;
}
/*cur */
public List<String> getAllLabels(){
List<String> labels = new ArrayList<String>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
labels.add(cursor.getString(0));
} while (cursor.moveToNext());
}
// closing connection
cursor.close();
db.close();
// returning labels
return labels;
}
}
Schedule_DB_Helper
package com.example.dn;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class Schedule_DB_Helper extends SQLiteOpenHelper {
static String DATABASE_NAME="patient_schedule";
public static final String TABLE_NAME="schedule";
public static final String KEY_ID="ID";
public static final String KEY_NAME="NAME";
public static final String KEY_DATE="DATE";
public static final String KEY_TIME="TIME";
//public static final String KEY_NOTI="NOTI";
public Schedule_DB_Helper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY, " +
""+KEY_NAME+" TEXT,"+KEY_DATE+" TEXT, "+KEY_TIME+" TEXT)";
db.execSQL(CREATE_TABLE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
}
AddSchedule
/* ©muhammad dn version 1.0
* created 2015
* run in 2 threads*/
package com.example.dn;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TimePicker;
import android.database.Cursor;
public class AddSchedule extends Activity implements OnClickListener {
private Button btn_save;
private EditText name,datee, timee ; //gender_n_u
private Schedule_DB_Helper schedHelper;
private SQLiteDatabase dataBase;
private String id,sName,sDate,sTime;
private boolean isUpdate;
private Spinner spin;
//prprivate ArrayList<String> sched_name = new ArrayList<String>();pinner Notifications List
String []notifications = {"5minutes", "10minutes","20minutes","30minutes","1hours"};
//Spinner spin;
String Notifications;
ArrayAdapter<String> adapter;
// Variable for storing current date and time
private int mYear, mMonth, mDay, mHour, mMinute;
String am_pm = "";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_schedule);
spin=(Spinner)findViewById(R.id.Notification_spinner);
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,notifications);
spin.setAdapter(adapter);
btn_save=(Button)findViewById(R.id.btn_save);
name=(EditText)findViewById(R.id.txtSchedName);
datee=(EditText)findViewById(R.id.txtSchedDate1);
timee=(EditText)findViewById(R.id.txtSchedTime);
datee.setOnClickListener(this);
timee.setOnClickListener(this);
btn_save.setOnClickListener(this);
name.setOnClickListener(this);
//add new record
findViewById(R.id.btnAddSchedule).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(),
AddPatient.class);
i.putExtra("update", false);
startActivity(i);
}
});
isUpdate=getIntent().getExtras().getBoolean("update");
if(isUpdate)
{
id=getIntent().getExtras().getString("ID");
sName=getIntent().getExtras().getString("NAME");
sDate=getIntent().getExtras().getString("DATE");
sTime=getIntent().getExtras().getString("TIME");
//sNoti=getIntent().getExtras().getString("NOTI");//
name.setText(sName);
datee.setText(sDate);
timee.setText(sTime);
//spin.setTag(sNoti);//
}
schedHelper=new Schedule_DB_Helper(this);
}
//©muhammad saveButton click event
public void onClick(View v) { //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
if (v == name) {
DbHelper dbHelperInstance = new DbHelper(this);
Cursor cursor = dbHelperInstance.displayPatient();
if(cursor != null) {
EditText pName = (EditText) findViewById(R.id.txtSchedName);
pName.setText(cursor.getString(cursor.getColumnIndex(DbHelper.KEY_NAME)));
}
}
//date and time picking**************************************
if (v == datee) {
// Process to get Current Date
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
// Launch Date Picker Dialog
DatePickerDialog dpd = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
#Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// Display Selected date in textbox
datee.setText(dayOfMonth + "-"
+ (monthOfYear + 1) + "-" + year);
}
}, mYear, mMonth, mDay);
dpd.show();
}
if (v == timee) {
// Process to get Current Time
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
// Launch Time Picker Dialog
TimePickerDialog tpd = new TimePickerDialog(this,
new TimePickerDialog.OnTimeSetListener() {
#Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute ) {
//Adding AM:PM in Time
if (c.get(Calendar.AM_PM) == Calendar.AM)
am_pm = "AM";
else if (c.get(Calendar.AM_PM) == Calendar.PM)
am_pm = "PM";
// Display Selected time in textbox
timee.setText(hourOfDay + ":" + minute+" "+am_pm);
}
}, mHour, mMinute, false);
tpd.show();
}
//saving data
if (v == btn_save) {
sName=name.getText().toString().trim();
sDate=datee.getText().toString().trim();
sTime=timee.getText().toString().trim();
// sNoti=spin.getTag().toString().trim();
if(sName.length()>0 && sDate.length()>0 && sTime.length()>0)
{
saveData();
}
else
{
AlertDialog.Builder alertBuilder=new AlertDialog.Builder(AddSchedule.this);
alertBuilder.setTitle("Invalid Data");
alertBuilder.setMessage("Please, Enter valid data");
alertBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertBuilder.create().show();}
}}
//©muhammad Saving Data to SQLite
private void saveData(){
dataBase= schedHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(Schedule_DB_Helper.KEY_NAME, sName);
values.put(Schedule_DB_Helper.KEY_DATE, sDate );
values.put(Schedule_DB_Helper.KEY_TIME, sTime );
//values.put(Schedule_DB_Helper.KEY_NOTI, sNoti );
System.out.println("");
if(isUpdate)
{
//update database with new data
dataBase.update(Schedule_DB_Helper.TABLE_NAME, values, Schedule_DB_Helper.KEY_ID+"="+id, null);
}
else
{
//insert data into database
dataBase.insert(Schedule_DB_Helper.TABLE_NAME, null, values);
}
//close database
dataBase.close();
finish();
}
}
activity_add_schedule
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="#+id/note1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="#222222"
android:drawableLeft="#drawable/note"
android:drawablePadding="10dp"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
android:text="#string/note1"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#ffffff"
android:textSize="12sp" />
<EditText
android:id="#+id/txtSchedName"
android:layout_width="260dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/pname"
android:layout_marginLeft="14dp"
android:ems="10"
android:hint="" >
<requestFocus />
</EditText>
<ImageView
android:id="#+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="#+id/txtSchedName"
android:layout_alignRight="#+id/pname"
android:contentDescription="#string/cd1"
android:src="#drawable/search" />
<EditText
android:id="#+id/txtSchedTime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="#+id/TextView02"
android:layout_alignLeft="#+id/txtSchedDate1"
android:layout_alignRight="#+id/txtSchedDate1"
android:ems="10"
android:hint="#string/hint7"
android:nextFocusDown="#+id/btn_save" />
<Button
android:id="#+id/btnAddSchedule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/pname"
android:layout_alignRight="#+id/pname"
android:layout_below="#+id/note1"
android:drawableLeft="#drawable/add_new"
android:drawablePadding="10dp"
android:onClick="addPatient"
android:text="#string/button_addPatient" />
<Button
android:id="#+id/btn_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:drawableLeft="#drawable/done"
android:drawablePadding="-40dp"
android:text="#string/button_done"
android:textSize="12sp"
android:width="163dp" />
<Button
android:id="#+id/btncancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:drawableLeft="#drawable/cancel"
android:drawablePadding="-30dp"
android:focusableInTouchMode="true"
android:onClick="cancel"
android:text="#string/button_cancel"
android:textSize="12sp"
android:width="164dp" />
<TextView
android:id="#+id/pname"
android:layout_width="291dp"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/txtSchedName"
android:layout_below="#+id/btnAddSchedule"
android:layout_marginTop="15dp"
android:text="#string/pname"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#686868"
android:textSize="12sp" />
<TextView
android:id="#+id/TextView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/btncancel"
android:layout_alignLeft="#+id/TextView02"
android:layout_marginBottom="34dp"
android:text="#string/textView6"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#686868"
android:textSize="14sp" />
<Spinner
android:id="#+id/Notification_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/btn_save"
android:layout_toRightOf="#+id/TextView01" />
<TextView
android:id="#+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/Notification_spinner"
android:layout_alignLeft="#+id/TextView01"
android:layout_marginBottom="26dp"
android:text="#string/textView5"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#686868"
android:textSize="14sp" />
<TextView
android:id="#+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/txtSchedTime"
android:layout_alignLeft="#+id/txtSchedName"
android:layout_marginBottom="21dp"
android:text="#string/textView4"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#686868"
android:textSize="14sp" />
<EditText
android:id="#+id/txtSchedDate1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/btn_save"
android:layout_alignRight="#+id/imageView1"
android:layout_alignTop="#+id/TextView01"
android:ems="10"
android:hint="#string/hint6"
android:nextFocusDown="#+id/textTIME" />
<TextView
android:id="#+id/TextView04"
android:layout_width="291dp"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/txtSchedName"
android:layout_below="#+id/txtSchedName"
android:layout_marginTop="17dp"
android:text="ID"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#686868"
android:textSize="12sp" />
<EditText
android:id="#+id/txtID"
android:layout_width="260dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/TextView04"
android:layout_alignBottom="#+id/TextView04"
android:layout_alignLeft="#+id/TextView04"
android:layout_marginLeft="35dp"
android:layout_toLeftOf="#+id/txtSchedDate1"
android:ems="10" />
</RelativeLayout>
Here is an example from an app of mine where I wanted to pull certain information from my SQLite database to instantiate a new custom object. I pulled the data based on UUID. You'll most likely have some other way of identifying which column to pull data from.
// Member variable for selecting all columns in my table
private String[] allColumns = { MyObjectDatabaseHelper.COLUMN_ONE
MyObjectDatabaseHelper.COLUMN_TWO,
MyObjectDatabaseHelper.COLUMN_THREE,
MyObjectDatabaseHelper.COLUMN_FOUR,
MyObjectDatabaseHelper.COLUMN_FIVE,
MyObjectDatabaseHelper.COLUMN_SIX,
MyObjectDatabaseHelper.COLUMN_SEVEN,
MyObjectDatabaseHelper.COLUMN_EIGHT};
public MyObject getSession(UUID mUUID)
{
db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(MyObjectDatabaseHelper.TABLE_MYOBJECT,
allColumns,
MyObjectDatabaseHelper.COLUMN_ONE + "=?",
new String [] {mUUID.toString()},
null,
null,
null,
null);
if (cursor != null)
{
cursor.moveToFirst();
}
MyObject mMyObject = new MyObject(UUID.fromString(cursor.getString(1)),
cursor.getString(2),
cursor.getString(3),
cursor.getString(4),
cursor.getString(5),
cursor.getString(6),
cursor.getInt(7));
cursor.close();
return mMyObject;
}
In this example, I selected all the columns in the table, then used all those values in the constructor for my custom object. What you can do is only select one column, if that's all you need, and then use that value to set the text in your TextView.
You might do something like this:
public getColumnText()
{
String text = cursor.getString(column);
return text;
}
For more information on query(...), see here.
public Cursor query (String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having, String orderBy,
String limit)
For more SQLite tutorials, see below:
http://www.tutorialspoint.com/android/android_sqlite_database.htm
http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
http://www.vogella.com/tutorials/AndroidSQLite/article.html#overview_sqlite

how to display one row from SQLite database to textview/edittext

I'm very new to android and about to create an app which holds customers and then related to it some actions.
My current unsolvable problem: After inserting customer data into database I want to switch the view and display the last entry with all fields. The inserted values like title, name but also automatically created fields like id and date. I can see that the data are in the database when I pull the database file from the DDMS but I don't know how to retrieve and display them in the desired view.
I saw dozens of examples for passing it to a listview but I couldn't find any example which would suit my needs. Maybe it's because I don't know how to ask correctly for it. If so, please point me in the right direction.
My DatabaseHelper:
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
public class DbHelper {
public static final String TABLE_CUSTOMERS = "customers";
public static final String COLUMN_CUSTOMER_ID = "_id";
public static final String COLUMN_CUSTOMER_TITLE = "title";
public static final String COLUMN_CUSTOMER_FIRST_NAME = "first_name";
public static final String COLUMN_CUSTOMER_LAST_NAME = "last_name";
public static final String COLUMN_CUSTOMER_DATE = "date";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_NAME = "myround.db";
private static final int DATABASE_VERSION = 1;
private final Context mCtx;
private static final String DATABASE_CREATE = "CREATE TABLE if not exists "
+ TABLE_CUSTOMERS + " (" + COLUMN_CUSTOMER_ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_CUSTOMER_TITLE + " VARCHAR, "
+ COLUMN_CUSTOMER_FIRST_NAME + " VARCHAR, " + COLUMN_CUSTOMER_LAST_NAME + " VARCHAR, " + COLUMN_CUSTOMER_DATE + " VARCHAR);";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS" + TABLE_CUSTOMERS);
onCreate(db);
}
}
public DbHelper(Context ctx) {
this.mCtx = ctx;
}
public DbHelper open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
if (mDbHelper != null) {
mDbHelper.close();
}
}
public long createCustomer(String Title, String FirstName, String LastName,
String Date) {
ContentValues initialValues = new ContentValues();
initialValues.put(COLUMN_CUSTOMER_TITLE, Title);
initialValues.put(COLUMN_CUSTOMER_FIRST_NAME, FirstName);
initialValues.put(COLUMN_CUSTOMER_LAST_NAME, LastName);
initialValues.put(COLUMN_CUSTOMER_DATE, Date);
long id = mDb.insert(TABLE_CUSTOMERS, null, initialValues);
return id;
}
public Cursor displayLastCustomer() {
Cursor mCursor = mDb.query(TABLE_CUSTOMERS, new String[] {COLUMN_CUSTOMER_ID,
COLUMN_CUSTOMER_TITLE, COLUMN_CUSTOMER_FIRST_NAME, COLUMN_CUSTOMER_LAST_NAME, COLUMN_CUSTOMER_DATE},
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToLast();
}
return mCursor;
}
}
And my CustomerHelper:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class CustomerHelper extends Activity implements OnClickListener {
public static final String TAG = "CustomerHelper";
EditText txtTtitle, txtFirstName, txtLastName,
editID, editTitle, editFirstName, editLastName, editDate;
Button btn_add_customer_to_db;
DbHelper dbHelper;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_new_customer);
txtTtitle = (EditText) findViewById(R.id.txt_title);
txtFirstName = (EditText) findViewById(R.id.txt_first_name);
txtLastName = (EditText) findViewById(R.id.txt_last_name);
editID = (EditText) findViewById(R.id.ntxt_customer_id);
btn_add_customer_to_db = (Button) findViewById(R.id.add_customer_to_db);
btn_add_customer_to_db.setOnClickListener(this);
dbHelper = new DbHelper(this);
dbHelper.open();
}
private String getDateTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Date date = new Date();
return dateFormat.format(date);
}
public void onClick(View view) {
if (view == btn_add_customer_to_db) {
String Title = txtTtitle.getText().toString();
String FirstName = txtFirstName.getText().toString();
String LastName = txtLastName.getText().toString();
String Date = getDateTime();
long id = dbHelper.createCustomer(Title, FirstName, LastName, Date);
if (id < 0) {
Toast.makeText(this, "Error - Unsuccessful", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(this, "Success - Record added",
Toast.LENGTH_LONG).show();
}
}
}
}
I'm looking for a solution to implement this view with the last entry into my CustomerHelperClass so that I can also modify or delete this entry.
For Inserting new customer I have add_new_customer.xml and I want to switch view to update_customer.xml with the last entry displayed. Both of them have the text fields for title, name etc
update_customer.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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" >
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:gravity="center"
android:text="#string/update_customer_xml_title"
android:textSize="14sp" />
<LinearLayout
android:id="#+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" >
<Button
android:id="#+id/add_activity_to_customer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:text="#string/add_activity_to_customer_sm_btn"
android:textSize="10sp" />
<Button
android:id="#+id/go_to_view_customer_management"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:text="#string/go_to_customer_mgmt"
android:textSize="10sp" />
<Button
android:id="#+id/go_to_main_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:text="#string/go_to_main_menu"
android:textSize="10sp" />
</LinearLayout>
<Button
android:id="#+id/delete_customer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/linearLayout1"
android:layout_alignLeft="#+id/linearLayout1"
android:layout_marginBottom="5dp"
android:text="#string/delete_customer" />
<Button
android:id="#+id/save_customer_changes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/delete_customer"
android:layout_alignBottom="#+id/delete_customer"
android:layout_alignRight="#+id/linearLayout1"
android:text="#string/save_customer_changes" />
<ScrollView
android:id="#+id/scrollView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/save_customer_changes"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="#+id/textView1"
android:layout_marginTop="5sp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="#+id/ntxt_customer_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="TextView" />
<EditText
android:id="#+id/ntxt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/ntxt_customer_id"
android:hint="#string/title"
android:inputType="text"
android:textAppearance="?android:attr/textAppearance"
android:textColor="#android:color/black" />
<EditText
android:id="#+id/ntxt_first_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/ntxt_title"
android:layout_marginTop="8dp"
android:hint="#string/first_name"
android:inputType="text"
android:textAppearance="?android:attr/textAppearance"
android:textColor="#android:color/black" />
<EditText
android:id="#+id/ntxt_last_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/ntxt_first_name"
android:layout_marginTop="8dp"
android:hint="#string/last_name"
android:inputType="text"
android:textAppearance="?android:attr/textAppearance"
android:textColor="#android:color/black" />
<EditText
android:id="#+id/ntxt_customer_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/ntxt_last_name"
android:layout_marginTop="8dp"
android:hint="date"
android:inputType="text"
android:textAppearance="?android:attr/textAppearance"
android:textColor="#android:color/black" />
</RelativeLayout>
</ScrollView>
edit:
} else {
Toast.makeText(this, "Success - Record added",
Toast.LENGTH_LONG).show();
setContentView(R.layout.update_customer);
}
}
DbHelper dbHelperInstance = new DbHelper(this); // Assuming it's running
// in an Activity
Cursor cursor = dbHelperInstance.displayLastCustomer();
if (cursor != null) {
EditText editTextFirstName = (EditText) findViewById(R.id.ntxt_first_name);
editTextFirstName.setText(cursor.getString(cursor
.getColumnIndex(DbHelper.COLUMN_CUSTOMER_FIRST_NAME)));
}
}
}
Hopefully you can build upon this answer, if you need further guidance, feel free to comment.
Let's assume you want the EditText with id ntxt_first_name to be populated with customer name. You'd write this code after you call displayLastCustomer()
DatabaseHelper dbHelperInstance = new DbHelper(this); //Assuming it's running in an Activity
Cursor cursor = dbHelperInstance.displayLastCustomer();
if(cursor != null) {
EditText editTextFirstName = (EditText) findViewById(R.id.ntxt_first_name);
editTextFirstName.setText(cursor.getString(cursor.getColumnIndex(DbHelper.COLUMN_CUSTOMER_FIRST_NAME)));
}
The above snippet tries to find the View (EditText) with id ntxt_frist_name within the inflated View hierarchy that was supplied using the setContentView(int resourceId) method (hopefully you have supplied R.layout.update_customer as its parameter. Then it simply sets its mText field to the value it obtains from the entry cursor is currently pointing at (set to last entry in the query by your displayLastCustomer() method) for the column DbHelper.COLUMN_CUSTOMER_FIRST_NAME.
Like I already wrote, I hope you can get from this snippet how to populate other Views obtaining data from other columns in your Cursor object.
Cheers and good luck!
EDIT: In case you are not running this code inside an Activity object (or object of a class derived from it) , you need to obtain the Context of the Activity which has the update_customer.xml file inflated.

java.lang.ClassCastException error when trying to save data in the sqlite on button click

I have tab in the activity when i click on the button to open tab view it works fine. Now after entering the data in the fields then when i click on the button to save it it gives me error.May be i have error in sqlite database constructor but not sure.Some one please help:
this is my code for a tab:
package com.example.doctormanager;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
public class General extends Activity {
Context context;
private Button proceed;
private EditText patient_name,mobile,address,email,dob,age;
ListView template_list;
Intent data_intent;
String name="";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.patient_general);
data_intent=getIntent();
name=data_intent.getStringExtra("name");
patient_name=(EditText)findViewById(R.id.txt17);
patient_name.setText(""+name);
mobile=(EditText)findViewById(R.id.txt23);
address=(EditText)findViewById(R.id.txt21);
email=(EditText)findViewById(R.id.txt19);
dob=(EditText)findViewById(R.id.txt25);
age=(EditText)findViewById(R.id.txt27);
ImageButton save= (ImageButton)findViewById(R.id.ib13);
save.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
SqlHandler db = new SqlHandler(this);
String p_name = patient_name.getText().toString();
String p_mobile = mobile.getText().toString();
String p_addr = address.getText().toString();
String p_email = email.getText().toString();
String p_dob = dob.getText().toString();
String p_age = age.getText().toString();
/**
* CRUD Operations
* */
// Inserting Contacts
Log.d("Insert: ", "Inserting ..");
db.addContact(new Patient_entery(0, p_name, p_mobile, p_addr, p_email, p_dob, p_age, null));
}
});
}
}
and this is for the database:
package com.example.doctormanager;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View.OnClickListener;
public class SqlHandler extends SQLiteOpenHelper {
public SqlHandler(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "doctormanager";
// Contacts table name
private static final String TABLE_PATIENT_GENERAL= "general";
// Contacts Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_PATIENT_NAME = "patient_name";
private static final String KEY_EMAIL = "patient_email";
private static final String KEY_PATIENT_ADDR = "patient_addr";
private static final String KEY_PATIENT_CONTACT_NUMBER = "patient_contact_number";
private static final String KEY_PATIENT_DOB = "patient_dob";
private static final String KEY_PATIENT_AGE = "patient_age";
private static final String KEY_PATIENT_SEX = "patient_sex";
public SqlHandler (OnClickListener onClickListener) {
super((Context) onClickListener, DATABASE_NAME, null, DATABASE_VERSION);
}
// public SqlHandler(OnClickListener onClickListener) {
// // TODO Auto-generated constructor stub
// }
// Creating Tables
#Override
public void onCreate(SQLiteDatabase db) {
String CREATE_PATIENT_TABLE = "CREATE TABLE " + TABLE_PATIENT_GENERAL + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_PATIENT_NAME + " TEXT,"
+ KEY_PATIENT_CONTACT_NUMBER + " TEXT," + KEY_EMAIL +"TEXT," + KEY_PATIENT_ADDR + "TEXT,"
+ KEY_PATIENT_DOB + "TEXT," + KEY_PATIENT_AGE + "TEXT," + KEY_PATIENT_SEX + "TEXT " + ")";
db.execSQL(CREATE_PATIENT_TABLE);
}
// Upgrading database
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PATIENT_GENERAL);
// Create tables again
onCreate(db);
}
/**
* All CRUD(Create, Read, Update, Delete) Operations
*/
// Adding new contact
void addContact(Patient_entery patient) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_PATIENT_NAME, patient.getName()); // Contact Name
values.put(KEY_PATIENT_CONTACT_NUMBER, patient.getPhoneNumber()); // Contact Phone
values.put(KEY_EMAIL, patient.getPatientEmail()); // Contact Name
values.put(KEY_PATIENT_ADDR, patient.getAddress()); // Contact Phone
values.put(KEY_PATIENT_DOB, patient.getDob()); // Contact Name
values.put(KEY_PATIENT_AGE, patient.getAge()); // Contact Phone
values.put(KEY_PATIENT_SEX, patient.getSex()); // Contact Name
// Inserting Row
db.insert(TABLE_PATIENT_GENERAL, null, values);
db.close(); // Closing database connection
}
// Getting single contact
Patient_entery getPatient(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_PATIENT_GENERAL, new String[] { KEY_ID,
KEY_PATIENT_NAME, KEY_PATIENT_CONTACT_NUMBER, KEY_EMAIL, KEY_PATIENT_ADDR, KEY_PATIENT_DOB, KEY_PATIENT_AGE, KEY_PATIENT_SEX }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Patient_entery patient = new Patient_entery(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7));
// return contact
return patient;
}
public String getAllStringValues() {
ArrayList<String> yourStringValues = new ArrayList<String>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor result = db.query(true, TABLE_PATIENT_GENERAL,
new String[] { KEY_PATIENT_NAME }, null, null, null, null,
null, null);
if (result.moveToFirst()) {
do {
yourStringValues.add(result.getString(result
.getColumnIndex(KEY_PATIENT_NAME)));
} while (result.moveToNext());
} else {
return null;
}
return KEY_PATIENT_NAME;
}
}
and this is the XML file:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#drawable/login_back">
<LinearLayout
android:layout_height="30dip"
android:layout_width="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="#+id/txt16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt17"
android:layout_width="200dp"
android:layout_height="20dp"
android:background="#drawable/edit_text_lines"
android:ems="10"
android:textSize="10dip" />
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/txt18"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt19"
android:layout_width="200dp"
android:layout_height="20dp"
android:text=""
android:textSize="10dip"
android:background="#drawable/edit_text_lines"
/>
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/txt20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Address: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt21"
android:layout_width="200dp"
android:layout_height="20dp"
android:text=""
android:textSize="10dip"
android:background="#drawable/edit_text_lines" />
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/txt22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Phone No.: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt23"
android:layout_width="200dp"
android:layout_height="20dp"
android:text=""
android:textSize="10dip"
android:background="#drawable/edit_text_lines"/>
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/txt24"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DOB: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt25"
android:layout_width="200dp"
android:layout_height="20dp"
android:text=""
android:textSize="10dip"
android:background="#drawable/edit_text_lines"/>
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/txt26"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Age: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/txt27"
android:layout_width="200dp"
android:layout_height="20dp"
android:text=""
android:textSize="10dip"
android:background="#drawable/edit_text_lines"/>
</LinearLayout>
<LinearLayout
android:layout_height="40dip"
android:layout_width="wrap_content"
android:orientation="horizontal">
<TextView
android:id="#+id/stxt27"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sex: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<RadioGroup
android:id="#+id/radioSex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:textColor="#FFFFFF" >
<RadioButton
android:id="#+id/radioMale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Male"
android:textColor="#FFFFFF"/>
<RadioButton
android:id="#+id/radioFemale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Female"
android:textColor="#FFFFFF" />
</RadioGroup>
</LinearLayout>
<TextView
android:id="#+id/txt28"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Patient/Family History: "
android:textSize="20dip"
android:textColor="#FFFFFF"/>
<EditText
android:id="#+id/edttxt27"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#FFFFFF" />
<ImageButton
android:id="#+id/ib14"
android:src="#drawable/template"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="1dip"
/>
<ImageButton
android:id="#+id/ib13"
android:src="#drawable/next_visit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
THANKS IN ADVANCE.
You need to pass Activity context on SqlHandler like:
SqlHandler db = new SqlHandler(youractivity.this);
in Button onclick()
And also Remove OnClickListener onClickListener() from SqlHanlder Constructer like:
public SqlHandler (Context con) {
super(con, DATABASE_NAME, null, DATABASE_VERSION);
}

How to get the value from element in the GridView in Android app?

basically, I'm a noob in Android programming and among other problems I'm stuck with this one: I have a GridView declared in my main layout and the XML definition for this grid in the separate xml. I'm adapting grid with SimpleCursorAdapter (not custom adapter). The thing is that I want to remember the value of corresponding ROW_ID when I touch the checkbox in the one of the displayed rows of data ... So, is there an option to do this without the need to customize SimpleCursorAdapter (BTW, is it possible?).
Here are snippets of Layout XML files and code, where I adapt cursor with SimpleCursorAdapter:
main.xml
<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:background="#BAF0ED"
android:gravity="right" >
<GridView
android:id="#+id/gridView1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_below="#+id/view1"
android:numColumns="2" >
</GridView>
</RelativeLayout>
grid.xml:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow>
<TextView
android:id="#+id/row_ID"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5px"
android:textColor="#4BA79E"
android:textSize="22dp" />
<TextView
android:id="#+id/name"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5px"
android:textSize="22dp" />
<TextView
android:id="#+id/email"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5px"
android:textSize="22dp" />
<CheckBox
android:id="#+id/chk"
android:layout_width="10px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="x"/>
</TableRow>
</TableLayout>
Using SimpleCursorAdapter:
public void showGridData() {
#SuppressWarnings("static-access")
String[] fromColumns = { db.KEY_ROWID, db.KEY_NAME, db.KEY_EMAIL };
int[] toViews = new int[] { R.id.row_ID, R.id.name, R.id.email };
db.openDatabase();
#SuppressWarnings("deprecation")
SimpleCursorAdapter sCAdapter = new SimpleCursorAdapter(this,
R.layout.table_row, db.getContacts(), fromColumns, toViews);
sCAdapter.setViewResource(R.layout.table_row);
gv.setAdapter(sCAdapter);
db.closeDatabase();
}
...and the method to read the value of the ROW_ID in the same record as the chebox is positioned (I'am getting allways the value of the first ROW_ID, wheather I touch first, second or n-th checkbox and this is the problem!):
public void x(View view) {
TextView tv = (TextView) findViewById(R.id.row_ID);
recordIds.add(Long.valueOf(tv.getText().toString()));
long[] longArray = new long[recordIds.size()];
for (int i = 0; i < recordIds.size(); i++) {
longArray[i] = recordIds.get(i);
Toast.makeText(this, String.valueOf(longArray[i]),Toast.LENGTH_LONG).show();
}
}
Thanks in advance and sorry for bothering you, regards,
Erik D.
add1 (1. edit)
Dear friends! Thank you all very much for the answer, but unfortunatelly this suggestions doesn't work for me. Let me post entire code, which I had altered with "setOnItemClickListener(new OnItemClickListener()". It still doesn't work...
I'm posting entire code (xml & java) if someone would have some spare time to look at it--I can't figure out what is wrong.
**activity_main.xml**
<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:gravity="right" >
<GridView
android:id="#+id/gridView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/editText2"
android:layout_marginTop="20dp"
android:numColumns="3" />
<EditText
android:id="#+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/button1"
android:layout_toRightOf="#+id/button1"
android:ems="10"
android:inputType="textEmailAddress" />
<EditText
android:id="#+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/gridView1"
android:layout_toLeftOf="#+id/button1"
android:ems="10"
android:inputType="textPersonName" />
<Button
android:id="#+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:onClick="AddRecord"
android:text="Insert" />
</RelativeLayout>
**table_row.xml**
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow>
<TextView
android:id="#+id/row_ID"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true"
android:padding="5px"
android:textSize="22dp" />
<TextView
android:id="#+id/name"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true"
android:padding="5px"
android:textSize="22dp" />
<TextView
android:id="#+id/email"
android:layout_width="50px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true"
android:padding="5px"
android:textSize="22dp" />
<CheckBox
android:id="#+id/chk"
android:layout_width="10px"
android:layout_height="wrap_content"
android:layout_weight="1" />
</TableRow>
</TableLayout>
*MainActivity.java*
> package net.learn2develop.databases;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
DBAdapter db;
EditText name, mail;
GridView gv;
Button button;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (EditText) findViewById(R.id.editText1);
mail = (EditText) findViewById(R.id.editText2);
db = new DBAdapter(this);
gv = (GridView) findViewById(R.id.gridView1);
showGridData();
}
public void AddRecord(View view) {
if (!(name.getText().toString().isEmpty())
&& !(mail.getText().toString().isEmpty())) {
db.openDatabase();
if (db.insertContact(name.getText().toString(), mail.getText()
.toString()) >= 0) {
showMessage("Record added succesfully!", "Inserting...");
db.closeDatabase();
showGridData();
}
} else {
showMessage("You can't add empty record!", "Inserting...");
}
}
public void showGridData() {
String[] fromColumns = { db.KEY_ROWID, db.KEY_NAME, db.KEY_EMAIL };
int[] toViews = new int[] { R.id.row_ID, R.id.name, R.id.email };
db.openDatabase();
SimpleCursorAdapter sCAdapter = new SimpleCursorAdapter(this,
R.layout.table_row, db.getContacts(), fromColumns, toViews);
sCAdapter.setViewResource(R.layout.table_row);
gv.setAdapter(sCAdapter);
// Implement On Item click listener
gv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(getApplicationContext(),
((TextView) v).getText(), Toast.LENGTH_SHORT).show();
}
});
db.closeDatabase();
}
public void showMessage(String message, String source) {
AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
dlgAlert.setCancelable(false);
dlgAlert.setMessage(message);
dlgAlert.setTitle(source);
dlgAlert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dlgAlert.setCancelable(true);
dlgAlert.create().show();
}
}
*DBAdapter.java*
package net.learn2develop.databases;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_NAME = "name";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";
static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE = "contacts";
static final int DATABASE_VERSION = 1;
static final String DATABASE_CREATE = "create table " + DATABASE_TABLE
+ " (" + KEY_ROWID + " integer primary key autoincrement, "
+ KEY_NAME + " text not null, " + KEY_EMAIL + " text not null);";
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
public DBAdapter(Context ctx) {// CONSTRUCTOR!!
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(DATABASE_CREATE);
} catch (SQLException e) {
e.printStackTrace();
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
}
public DBAdapter openDatabase() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
public void closeDatabase() {
DBHelper.close();
}
public long insertContact(String name, String email) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAIL, email);
return db.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteContact(long rowId) {
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
public Cursor getContacts() {
return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_NAME,
KEY_EMAIL }, null, null, null, null, null);
}
public Cursor getContact(long rowId) throws SQLException {
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID, KEY_NAME, KEY_EMAIL }, KEY_ROWID + "=" + rowId,
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateContact(long rowId, String name, String email) {
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}
Dear friends, thanks in advance once again, regards,
Erik D.
You can use setTag and getTag methods of View class to tie a piece of information to your views.
You need to implement ItemClickListener. onItemClick will be invoked for each item clicked in the gridview and provides the position of click.
Check this sample code on how to implement it. Fetch this position data from adapter.
I have found the origin of the problem - basically, all it has to be done is defining the view element of the GridView with:
android:focusable="false"
android:focusableInTouchMode="false"
for instance:
<TextView
android:id="#+id/row_ID"
android:layout_width="50px"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:textSize="20dp" />
With these two parameters elements of the GridView do not steal the focus of the grid and listener on the grid works.
Have a great time,
Erik D.

insert code causing app to stop

i have this set of codes used for inserting data into my sqlite database. but why does my app stop when i try to insert?
package edu.nyp.project;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.view.View.OnClickListener;
public class AddData extends Activity {
Button insertButton = null;
EditText shopText= null;
EditText dealText= null;
EditText locationText= null;
EditText websiteText= null;
EditText categoryText= null;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adddata);
insertButton = (Button) findViewById(R.id.button1);
insertButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
DBAdapter dbAdapter = new
DBAdapter(getApplicationContext());
try{
dbAdapter.open();
String shop = shopText.getText().toString();
String deal = dealText.getText().toString();
String location = locationText.getText().toString();
String website = websiteText.getText().toString();
String category = categoryText.getText().toString();
}
catch(Exception e){
Log.d("Add Data ", e.getMessage());
}
finally{
if (dbAdapter != null)
dbAdapter.close();
}
}
});
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.adddata, menu);
return true;
}
}
here is the code for the DBAdapter file for reference.
package edu.nyp.project;
import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_SHOP = "shop";
public static final String KEY_DEAL = "deal";
public static final String KEY_LOCATION = "location";
public static final String KEY_WEBSITE = "website";
public static final String KEY_CATEGORY = "category";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "Project";
private static final String DATABASE_TABLE = "Deals";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table Deals (_id integer primary key autoincrement, " +
"shop varchar not null, deal varchar not null, " +
"location varchar not null, website varchar not null, category text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter (Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate (SQLiteDatabase db)
{
try{
db.execSQL(DATABASE_CREATE);
}
catch(SQLException e){
e.printStackTrace();
}
}
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion+ "to "+ newVersion
+ "which will destroy all data");
db.execSQL("DROP TABLE IF EXISTS Deals");
onCreate(db);
}
}
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
public void close()
{
DBHelper.close();
}
public long insertDeal(String shop, String deal, String location, String website, String category)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_SHOP, shop);
initialValues.put(KEY_DEAL, deal);
initialValues.put(KEY_LOCATION, location);
initialValues.put(KEY_WEBSITE, website);
initialValues.put(KEY_CATEGORY, category);
return db.insert(DATABASE_TABLE, null, initialValues);
}
}
and xml file is below, also for reference as well.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TableRow
android:id="#+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<EditText
android:id="#+id/shopText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Shop name" >
<requestFocus />
</EditText>
</TableRow>
<TableRow
android:id="#+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<EditText
android:id="#+id/dealText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Deal" >
</EditText>
</TableRow>
<TableRow
android:id="#+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<EditText
android:id="#+id/locationText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Location" >
</EditText>
</TableRow>
<TableRow
android:id="#+id/tableRow4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<EditText
android:id="#+id/websiteText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Website" >
</EditText>
</TableRow>
<TableRow
android:id="#+id/tableRow5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<EditText
android:id="#+id/categoryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Category" >
</EditText>
</TableRow>
</TableLayout>
<LinearLayout
android:id="#+id/LinearLayout1"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<Button
android:id="#+id/button1"
android:layout_width="wrap_content"
android:layout_height="60px"
android:text="Insert" />
<Button
android:id="#+id/button2"
android:layout_width="wrap_content"
android:layout_height="60px"
android:text="Delete" />
<Button
android:id="#+id/button3"
android:layout_width="wrap_content"
android:layout_height="60px"
android:text="Search" />
</LinearLayout>
</LinearLayout>
becouse I think you dont bind that components with findViewById:
shopText.getText().toString();
String deal = dealText.getText().toString();
String location = locationText.getText().toString();
String website = websiteText.getText().toString();
String category = categoryText.getText().toString();
result should be a NullPointerException.
Show us youre LogCat...
Otherwise add this to youre on create and try it again:
shopText= (EditText)findViewById(R.id.THE_ID);
dealText= (EditText)findViewById(R.id.THE_ID);;
locationText= (EditText)findViewById(R.id.THE_ID);;
websiteText= (EditText)findViewById(R.id.THE_ID);;
categoryText= (EditText)findViewById(R.id.THE_ID);;
First of all get all EditText By id.
try{
shopText=(EditText)findViewById(R.id.shopText)
//get All EditText by id like above
dbAdapter.open();
String shop = shopText.getText().toString();
String deal = dealText.getText().toString();
String location = locationText.getText().toString();
String website = websiteText.getText().toString();
String category = categoryText.getText().toString();
//secondly
dbAdapter.insertDeal(shop,deal,location,website,category);
}

Categories

Resources