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.
Related
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.
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
i am new in android. i created a database and a listview. i want to add picture to listview by take picture by camera.
this is my input class:
package com.kalagar.warehouse;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
public class AddNew extends Activity implements View.OnClickListener {
ImageButton ib;
Button b;
ImageView iv;
EditText etName,etKharid,etForoush;
Intent i;
final static int CameraData = 0;
Bitmap bmp;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.addnew);
startAddNew();
}
private void startAddNew() {
ib = (ImageButton) findViewById(R.id.ibTakePic);
b = (Button) findViewById(R.id.bSave);
iv = (ImageView) findViewById(R.id.ivPic);
etName = (EditText) findViewById(R.id.etName);
etKharid = (EditText) findViewById(R.id.etKharid);
etForoush = (EditText) findViewById(R.id.etForoush);
b.setOnClickListener(this);
ib.setOnClickListener(this);
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibTakePic:
i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, CameraData);
break;
case R.id.bSave:
boolean didItWork = true;
try {
String name = etName.getText().toString();
String kharid = etKharid.getText().toString();
String foroush = etForoush.getText().toString();
DataBase entry = new DataBase(AddNew.this);
entry.open();
entry.createEntry(name, kharid, foroush);
entry.close();
} catch (Exception e) {
// TODO Auto-generated catch block
didItWork = false;
String error = e.toString();
Dialog d = new Dialog(this);
d.setTitle("oooh ! Nooo !!");
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
e.printStackTrace();
}finally{
if (didItWork){
Dialog d = new Dialog(this);
d.setTitle("Heck Yea!");
TextView tv = new TextView(this);
tv.setText("Success");
d.setContentView(tv);
d.show();
}
}
break;
}
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
bmp = (Bitmap) extras.get("data");
iv.setImageBitmap(bmp);
}
}
}
this is my input XML :
<?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" >
<EditText
android:id="#+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="نام محصول"
>
<requestFocus />
</EditText>
<EditText
android:id="#+id/etKharid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="قیمت خرید"
android:inputType="number"
/>
<EditText
android:id="#+id/etForoush"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="قیمت فروش"
android:inputType="number"
/>
<ImageButton
android:id="#+id/ibTakePic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="#drawable/ic_launcher"
android:layout_gravity="center"/>
<ImageView
android:id="#+id/ivPic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="#drawable/ic_launcher"
android:layout_gravity="center"/>
<Button
android:id="#+id/bSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ذخیره"
android:layout_gravity="center" />
</LinearLayout>
this is my DataBase :
package com.kalagar.warehouse;
import java.util.ArrayList;
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 DataBase {
private static final String LOGTAG = "WAREHOUSE";
private static final String DATABASE_TABLE = "WareHouse";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "SellList";
public static final String ROW_ID = "_id";
public static final String ROW_NAME = "nameOfObject";
public static final String ROW_KHARID = "ghBuy";
public static final String ROW_FOROUSH = "ghSell";
public static final String ROW_PICTURE = "picture";
private static final String TABLE_CREATE = "CREATE TABLE " + DATABASE_TABLE
+ " (" + ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ROW_NAME
+ " TEXT, " + ROW_KHARID + " NUMERIC, " + ROW_FOROUSH
+ " NUMERIC, " + ROW_PICTURE + " TEXT " + ")";
private WareHouseDdbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class WareHouseDdbHelper extends SQLiteOpenHelper {
public WareHouseDdbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CREATE);
Log.i(LOGTAG, "Table has been create");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
}
}
public DataBase(Context c) {
ourContext = c;
}
public DataBase open() throws SQLException {
ourHelper = new WareHouseDdbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close() {
ourHelper.close();
}
public long createEntry(String name, String kharid, String foroush) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(ROW_NAME, name);
cv.put(ROW_KHARID, kharid);
cv.put(ROW_FOROUSH, foroush);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public ArrayList<String> getDataName() {
// TODO Auto-generated method stub
String[] columns = new String[] { ROW_ID, ROW_NAME, ROW_KHARID,
ROW_FOROUSH };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
null, null);
ArrayList<String> result = new ArrayList<String>();
int iRow = c.getColumnIndex(ROW_ID);
int iName = c.getColumnIndex(ROW_NAME);
int iKharid = c.getColumnIndex(ROW_KHARID);
int iForoush = c.getColumnIndex(ROW_FOROUSH);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
result.add(c.getString(iRow) + " " + c.getString(iName)
+ " " + c.getString(iKharid) + " " + c.getString(iForoush));
}
return result;
}
}
this is my class for show data in listView:
package com.kalagar.warehouse;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class Show extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
Name();
}
private void Name() {
ListView tvName = (ListView) findViewById(R.id.lvListOfObject);
DataBase infoName = new DataBase(this);
infoName.open();
ArrayList<String> dataName = infoName.getDataName();
infoName.close();
tvName.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, dataName));
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.show, menu);
return true;
}
}
and this is my ListView XML that i want add picture to each row:
<?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/tvListHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:textSize="30dp"
android:text="لیست محصولات" />
<ListView
android:id="#+id/lvListOfObject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/searchView1"
android:layout_centerHorizontal="true" >
</ListView>
<SearchView
android:id="#+id/searchView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="#+id/tvListHeader" >
</SearchView>
</RelativeLayout>
how can i show ListView With this Template:
<?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" >
<ImageView
android:id="#+id/ivPicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:adjustViewBounds="true"
android:maxHeight="80dp"
android:maxWidth="80dp"
android:src="#drawable/download" />
<TextView
android:id="#+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="#string/name_shown_here"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="#+id/tvKharid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/tvForoush"
android:layout_centerHorizontal="true"
android:text="Kharid" />
<TextView
android:id="#+id/tvForoush"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="#+id/ivPicture"
android:layout_alignLeft="#+id/tvKharid"
android:text="Foroush" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="#+id/tvKharid"
android:layout_alignParentRight="true"
android:text="قیمت خرید" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/tvForoush"
android:layout_alignBottom="#+id/tvForoush"
android:layout_alignParentRight="true"
android:text="قیمت فروش" />
</RelativeLayout>
what code i need to add and where i need to add?
Sorry for my english !
why you don't save picture in Sdcard instead of databse.
This link help you to do so
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.
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);
}