java - Implementing an SQLite Database in Android App -
my application allows user create text message , specify time , date when sent. i'm having issues though. due nature of pending intents i'm not able create new 1 each message. if user submits new text sent before pending intent executed overwrites previous message. stands can't have more 1 message queued send.
my solution maintain sqlite database various message details , update pending intent whichever message comes next in database. has added benefit of making implementation of displaying list of current messages sent , editing messages sent lot simpler.
the issue don't think i'm setting database properly. when run in debug mode doesn't seem entering database helper class (messageshelper) , instantiating database variable. i'm not sure i'm doing wrong , have been following android sqlite dev guide. appreciate help/tips can give me.
table contract class
public class messages { private messages(){} public static abstract class texts implements basecolumns { public static final string table_name = "texts"; public static final string default_sort_order = "stime desc"; public static final string column_name_recipient = "recipient"; public static final string column_name_message = "message"; public static final string column_name_send_time = "stime"; public static final string authority = "com.rastellij.deferredsms"; } } db helper class
public class messageshelper extends sqliteopenhelper{ private static final string tag = "messageshelper"; private static final string text_type = " text"; private static final string comma_sep = ","; private static final string sql_create_entries = "create table " + messages.texts.table_name + " (" + messages.texts._id + " integer primary key," + messages.texts.column_name_message + text_type + comma_sep + messages.texts.column_name_recipient + text_type + comma_sep + messages.texts.column_name_send_time + text_type + " )"; private static final string sql_delete_entries = "drop table if exists " + messages.texts.table_name; // if change database schema, must increment database version. public static final int database_version = 1; public static final string database_name = "messages.db"; messageshelper(context context) { super(context, database_name, null, database_version); } public void oncreate(sqlitedatabase db) { db.execsql(sql_create_entries); } public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { // database cache online data, upgrade policy // discard data , start on log.w(tag, "upgrading database version " + oldversion + " " + newversion + ", destroy old data"); db.execsql(sql_delete_entries); oncreate(db); } public void ondowngrade(sqlitedatabase db, int oldversion, int newversion) { onupgrade(db, oldversion, newversion); } } main activity
public class mainactivity extends fragmentactivity { private customdatetimepicker customdt; private messageshelper mdbhelper; private edittext phonename, messagetext; private string phonenum, alarmtime; private textview alarmtext; private button sendbutt; private int pickerhour = 0, pickermin = 0, pickeryear = 0, pickermonth = 0, pickerday = 0; private static final int contact_picker_result = 1; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //set custom date time picker customdt = new customdatetimepicker(this, new customdatetimepicker.icustomdatetimelistener() { public void onset(dialog dialog, calendar calendarselected, date dateselected, int year, string monthfullname, string monthshortname, int monthnumber, int date, string weekdayfullname, string weekdayshortname, int hour24, int hour12, int min, int sec, string am_pm) { // time chosen user pickeryear = year; pickermonth = monthnumber; pickerday = date; pickerhour = hour24; pickermin = min; alarmtime = weekdayfullname + ", " + monthfullname + " " + date + ", " + year + " " + hour12 + ":" + pickermin + " " + am_pm; alarmtext.settext("send date: " + alarmtime); } public void oncancel() {} }); customdt.set24hourformat(false); customdt.setdate(calendar.getinstance()); findviewbyid(r.id.starttimesetdialog).setonclicklistener(new onclicklistener() { public void onclick(view v) { customdt.showdialog(); } }); // setup global variables phonename = (edittext)findviewbyid(r.id.phoneno); messagetext = (edittext)findviewbyid(r.id.txtmessage); sendbutt = (button)findviewbyid(r.id.btnsendsms); alarmtext = (textview)findviewbyid(r.id.alarmprompt); //create/find db mdbhelper = new messageshelper(this); // start contact finder phonename.setonclicklistener(new view.onclicklistener() { public void onclick(view v) { intent intent = new intent(intent.action_pick, contactscontract.contacts.content_uri); startactivityforresult(intent, contact_picker_result); } }); // "send" message sendbutt.setonclicklistener(new view.onclicklistener() { public void onclick(view v) { //make sure fields filled if (phonename.gettext().tostring().trim().length() == 0) { toast.maketext(getapplicationcontext(), "please enter phone number", toast.length_long).show(); return; } if (messagetext.gettext().tostring().trim().length() == 0) { toast.maketext(getapplicationcontext(), "please enter message", toast.length_long).show(); return; } //create calendar variable equates desired time sent calendar cal = calendar.getinstance(); cal.set(calendar.year, pickeryear); cal.set(calendar.month, pickermonth); cal.set(calendar.date, pickerday); cal.set(calendar.hour_of_day, pickerhour); cal.set(calendar.minute, pickermin); cal.set(calendar.second, 0); cal.set(calendar.millisecond, 0); //set pending intent , assign put in alarm manger //will change process once db set proper intent sintent = new intent(mainactivity.this, sendtservice.class); sintent.putextra("phoneno", phonenum.tostring()); sintent.putextra("msgtxt", messagetext.gettext().tostring()); pendingintent psintent = pendingintent.getservice(mainactivity.this,0, sintent, pendingintent.flag_cancel_current); alarmmanager alarm = (alarmmanager)getsystemservice(context.alarm_service); alarm.set(alarmmanager.rtc_wakeup, cal.gettimeinmillis(), psintent); //add latest message db sqlitedatabase db = mdbhelper.getwritabledatabase(); contentvalues values = new contentvalues(); values.put(messages.texts.column_name_message, messagetext.gettext().tostring()); values.put(messages.texts.column_name_recipient, phonenum.tostring()); values.put(messages.texts.column_name_send_time, cal.tostring()); db.insert(messages.texts.table_name, null, values); //clear fields , let user know what's going on phonename.settext(""); messagetext.settext(""); alarmtext.settext(""); toast.maketext(getapplicationcontext(), "your message sent on " + alarmtime, toast.length_long).show(); } }); } //associated contact picker getting it's results @override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (resultcode == result_ok) { switch (requestcode) { case contact_picker_result: cursor cursor = null; string phonenumber = ""; list<string> allnumbers = new arraylist<string>(); int phoneidx = 0; try { uri result = data.getdata(); string id = result.getlastpathsegment(); cursor = getcontentresolver().query(phone.content_uri, null, phone.contact_id + "=?", new string[] { id }, null); phoneidx = cursor.getcolumnindex(phone.data); if (cursor.movetofirst()) { while (cursor.isafterlast() == false) { phonenumber = cursor.getstring(phoneidx); allnumbers.add(phonenumber); cursor.movetonext(); } } else { //no results actions } } catch (exception e) { //error actions } { if (cursor != null) cursor.close(); final charsequence[] items = allnumbers.toarray(new string[allnumbers.size()]); alertdialog.builder builder = new alertdialog.builder(getapplicationcontext()); builder.settitle("choose number"); builder.setitems(items, new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int item) { phonenum = items[item].tostring(); phonenum = phonenum.replace("-", ""); phonename.settext(phonenum); } }); alertdialog alert = builder.create(); if(allnumbers.size() > 1) { alert.show(); } else { phonenum = phonenumber.tostring(); phonenum = phonenum.replace("-", ""); phonename.settext(phonenum); } if (phonenumber.length() == 0) { //no numbers found actions } } break; } } else { //activity result error actions } } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.activity_main, menu); return true; } }
my initial guess: sql_create_entries statement missing semicolon @ end of create table statement. in google's notepad example , in of databases i've included semicolon , never had problem.
Comments
Post a Comment