我的应用程序允许用户创建短信并指定他们希望何时发送短信的时间和日期。我有一些问题。由于Pending Intents的性质,我无法为每条消息创建一个新的。因此,如果用户在执行挂起的意图之前提交要发送的新文本,则它将覆盖先前的消息。因此,我不能排队多于一条消息发送。
我的解决方案是使用各种消息详细信息维护一个SQLite数据库,只需使用数据库中接下来的消息更新待处理的意图。这还有一个额外的好处,即实现显示要发送的当前消息列表,并且编辑要发送的消息要简单得多。
问题是我认为我没有正确设置数据库。当我在调试模式下运行时,它似乎没有进入我的数据库助手类(MessagesHelper)并实例化数据库变量。我不确定我做错了什么,一直在关注android SQLite开发指南。非常感谢你能给我的任何帮助/提示。
表合约类
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";
}
}
数据库助手类
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 you change the database schema, you must increment the 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) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
主要活动
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 up the 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) {
// Do something with the time chosen by the 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" the message
sendButt.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
//Make sure the fields are filled
if (phoneName.getText().toString().trim().length() == 0)
{
Toast.makeText(getApplicationContext(), "Please enter a phone number", Toast.LENGTH_LONG).show();
return;
}
if (messageText.getText().toString().trim().length() == 0)
{
Toast.makeText(getApplicationContext(), "Please enter your message", Toast.LENGTH_LONG).show();
return;
}
//Create a calendar variable that equates to the desired time to be 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 up the pending intent and assign put it in the alarm manger
//will change this process once db is set up 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 the latest message to the 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 all the fields and let the user know what's going on
phoneName.setText("");
messageText.setText("");
alarmText.setText("");
Toast.makeText(getApplicationContext(), "Your Message will be sent on " + alarmtime, Toast.LENGTH_LONG).show();
}
});
}
//Associated with the 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
}
finally
{
if (cursor != null) cursor.close();
final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]);
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("Choose a 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;
}
}
答案 0 :(得分:0)
我的初步猜测:您的SQL_CREATE_ENTRIES
语句在CREATE TABLE语句末尾缺少分号。在谷歌的记事本示例和我的所有数据库中,我总是包含分号,从未出现过问题。