2012-04-03 10 views
0

Ich bin sehr neu in Android und Programmierung im Allgemeinen. Ich habe einen E-Mail-Empfänger, der den E-Mail-Client K9 verwendet. Ich überprüfe die E-Mail auf korrekte Formatierung und nehme den Inhalt der E-Mail und gebe ihn in eine SQLite-Datenbank auf dem Telefon ein. Der Empfänger funktioniert ordnungsgemäß. Das Problem ist, dass wenn ich eine richtig formatierte Nachricht sende, macht es 2 Datensätze von der ersten E-Mail. Wenn ich eine andere Nachricht sende, ohne die erste zu löschen, macht sie 4 Datensätze der Sekunde. Der dritte macht 6 Datensätze usw. Ich weiß, da ist wahrscheinlich etwas offensichtlich, dass ich vermisse, aber ich kann das Problem nicht finden. HierErhalten 2 SQLite Datensätze für jede E-Mail erhalten

ist der Code:

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(); 

} 

Die "jobextractor" Methode funktioniert gut, so dass ich es nicht enthalten. Wenn mir jemand helfen kann, würde ich es begrüßen.

Danke

Nur eine Randnotiz. Ich möchte auch, dass nur ungelesene E-Mails angezeigt werden, aber das funktioniert auch nicht. Kein großes Problem an dieser Stelle, aber wenn Sie eine Antwort darauf haben, wäre ich sehr dankbar.

Antwort

0

Ich habe das Problem gefunden.

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

Das Problem war hier. Ich habe überprüft, ob die Jobnummer mit vorhandenen Datensätzen in der Datenbank übereinstimmt. Es ging durch jeden Datensatz in der Tabelle und fügte einen neuen Job für jeden Datensatz hinzu, der nicht übereinstimmte. Ich habe die Zeile jobExctractor durch eine boolesche Prüfung ersetzt, und wenn die Prüfung nach der Schleife den Wert true zurückgegeben hat, habe ich den Job nicht hinzugefügt.

Verwandte Themen