2013-05-22 2 views
1

내 응용 프로그램을 사용하면 텍스트 메시지를 작성하고 보낼 시간과 날짜를 지정할 수 있습니다. 그래도 문제가 있습니다. 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; 
} 
} 

답변

0

내에서 예상 결과 : SQL_CREATE_ENTRIES 문에 CREATE TABLE 문의 끝에 세미콜론이 누락되었습니다. Google의 메모장 예제와 모든 데이터베이스에서 필자는 항상 세미콜론을 포함 시켰으므로 전혀 문제가 없었습니다.

관련 문제