0

私はアンドロイドとプログラミング全般に非常に慣れていません。K9 電子メール クライアントを使用する電子メール レシーバーがあります。メールのフォーマットが適切かどうかを確認し、メールの内容を取得して電話の SQLite データベースに入力しています。受信機は正常に動作しています。問題は、適切な形式のメッセージを送信すると、最初のメールから 2 つのレコードが作成されることです。最初のメッセージを削除せずに別のメッセージを送信すると、2 番目のレコードが 4 つ作成されます。3 つ目は 6 つのレコードを作成するなどです。明らかに何かが欠けていることはわかっていますが、問題を見つけることができません。

コードは次のとおりです。

    public class EmailReceiver extends BroadcastReceiver{
private JobsData jobs;
public static final Uri k9uri = Uri.parse("content://com.fsck.k9.messageprovider/inbox_messages/");
static String[] messages_projection = new String[] {"subject", "preview", "unread"};


@Override
public void onReceive(Context context, Intent intent) {
    try {
        Context mContext = context;
        Cursor curSt = mContext.getContentResolver().query(k9uri, messages_projection, "unread='true'", null, null);
        curSt.moveToFirst();
        String preview = null;
        String subject = null;
        jobs = new JobsData(context);
        int i = 0;
        while (!curSt.isAfterLast()) {
            subject = curSt.getString(0);
            boolean test = subject.startsWith("JOB# ");
            if (test) {
                boolean check = true;
                try {
                    for (int k = 5; k < subject.length(); k++) {
                        if (!Character.isDigit(subject.charAt(k))) {
                            check = false;
                            break;
                        }
                    }
                } catch (Exception e) {
                } finally {
                }

                if (check) {
                    preview = curSt.getString(1);
                    compareDb(subject.substring(7), preview, context);
                }

            }
            curSt.moveToNext();
        }
        curSt.close();
    } catch (Exception e) {
        Toast toast = Toast.makeText(context, e.toString(), Toast.LENGTH_LONG);
        toast.show();
    }

    if (emails != null) {

     }
}


private void compareDb (String jobNo, String preview, Context context) {
    try {
    String[] dbJobs = new String[] {"JobNo"};
    SQLiteDatabase db = jobs.getReadableDatabase();
    Cursor dbCur = db.query(tableName, dbJobs, null, null, null, null, null);
    dbCur.moveToFirst();
    while (!dbCur.isAfterLast()) {
        if (!jobNo.equals(dbCur.getString(0))) {
            jobExtractor(preview, jobNo, context);
        }
        dbCur.moveToNext();
    }
    dbCur.close();
    } catch (Exception e){
        Toast toast = Toast.makeText(context, e.toString(), Toast.LENGTH_LONG);
        toast.show();

    }
}

private void addJobs(Job job){
    SQLiteDatabase db = jobs.getWritableDatabase();
    ContentValues values = new ContentValues();
        values.put(custName, job.getCustName());
        values.put(jobNumber, job.getJobNumber());
        values.put(jobType, job.getJobType());
        values.put(address, job.getAddress());
        values.put(zip, job.getZip());
        values.put(contact, job.getContact());
        values.put(contactNumber, job.getContactNumber());
        values.put(problem, job.getProblem());

    db.insertOrThrow(tableName, null, values);
    db.close();

}

「jobextractor」メソッドは正常に機能するため、含めませんでした。誰かが私を助けてくれれば、私はそれを感謝します。

ありがとう

補足です。また、未読メールのみを表示したいのですが、それも機能していません。現時点では大きな問題ではありませんが、ご回答いただければ幸いです。

4

1 に答える 1

0

問題が見つかりました。

while (!dbCur.isAfterLast()) { 
    if (!jobNo.equals(dbCur.getString(0))) { 
        jobExtractor(preview, jobNo, context); 
    } 
    dbCur.moveToNext(); 
}

問題はここにありました。ジョブ番号がデータベース内の既存のレコードと一致するかどうかを確認していました。テーブル内の各レコードを調べ、一致しなかったすべてのレコードに新しいジョブを追加しました。jobExctractor 行をブール値チェックに置き換えました。ループ後にチェックが true を返した場合は、ジョブを追加しませんでした。

于 2012-04-26T15:55:03.053 に答える