내 응용 프로그램을 사용하면 텍스트 메시지를 작성하고 보낼 시간과 날짜를 지정할 수 있습니다. 그래도 문제가 있습니다. Pending Intents의 특성으로 인해 각 메시지에 대해 새 메시지를 작성할 수 없습니다. 따라서 보류중인 인 텐트가 실행되기 전에 사용자가 새로운 텍스트를 전송하면 이전 메시지를 덮어 씁니다. 그래서 그것이 의미하는 한 가지 이상의 메시지가 대기열에 올릴 수 없습니다.안드로이드 애플 리케이션에서 SQLite 데이터베이스 구현
내 솔루션은 SQLite 데이터베이스를 다양한 메시지 세부 정보로 유지하고 데이터베이스의 다음 메시지와 함께 보류중인 인 텐트를 업데이트하는 것입니다. 또한 전송할 현재 메시지 목록을 표시하고 편집 메시지를 훨씬 간단하게 전송할 수있는 이점이 있습니다.
문제는 데이터베이스를 제대로 설정하지 않는다는 것입니다. 디버그 모드에서 실행하면 데이터베이스 도우미 클래스 (MessagesHelper)를 입력하고 데이터베이스 변수를 인스턴스화하지 않는 것 같습니다. 내가 뭘 잘못하고 안드로이드 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";
}
}
DB 도우미 클래스
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;
}
}