2012-04-03 2 views
0

Я очень новичок в android и программировании в целом. У меня есть почтовый ящик, использующий почтовый клиент K9. Я проверяю электронное письмо для правильного форматирования и размещения содержимого электронной почты и ввода его в базу данных SQLite по телефону. Приемник работает правильно. Проблема в том, что когда я отправляю правильно отформатированное сообщение, он делает 2 записи из первого письма. Если я отправлю другое сообщение без удаления первого, он сделает 4 записи второго. Третий делает 6 записей и т. Д. Я знаю, что, вероятно, есть что-то очевидное, что мне не хватает, но я не могу найти проблему.Получение 2 записей SQLite для каждого полученного сообщения

Вот код:

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» работает отлично, так что я не включил его. Если кто-то может мне помочь, я был бы признателен.

Thanks

Просто примечание стороны. Я также хочу, чтобы он смотрел только на непрочитанное письмо, но это тоже не работает. На данный момент это не серьезная проблема, но если у вас есть ответ на это, я буду очень благодарен.

ответ

0

Я нашел проблему.

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

Проблема была здесь. Я проверял, соответствует ли номер задания существующим записям в базе данных. Он прошел через каждую запись в таблице и добавил новую работу для каждой записи, которая не соответствовала. Я заменил строку jobExctractor логической проверкой, и если проверка вернула true после цикла, я не добавил работу.

Смежные вопросы