簡體   English   中英

在Android App中實現SQLite數據庫

[英]Implementing an SQLite Database in Android App

我的應用程序允許用戶創建一條短信,並指定他們希望發送短信的時間和日期。 我有一些問題。 由於待定意圖的性質,我無法為每條消息創建一個新消息。 因此,如果用戶在執行掛起的意圖之前提交要發送的新文本,它將覆蓋先前的消息。 這樣看來,我最多只能排隊等待發送一條消息。

我的解決方案是維護一個具有各種消息詳細信息的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;
}
}

我的最初猜測:您的SQL_CREATE_ENTRIES語句在CREATE TABLE語句的末尾缺少分號。 在Google的記事本示例中,以及在我的所有數據庫中,我總是包含分號,並且從未遇到過問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM