2012-04-03 1 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"방법은 잘 작동 그래서 그것을 포함하지 않았다 : 여기

는 코드입니다. 누군가 나를 기쁘게 해주면 감사하겠습니다.

감사

그냥 보조 노트. 또한 읽지 않은 이메일 만보기를 원하지만 그 중 하나가 작동하지 않습니다. 이 시점에서 주요한 문제는 아니지만 그에 대한 답이 있으면 매우 감사 할 것입니다.

답변

0

문제가 발견되었습니다.

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

여기에 문제가있었습니다. 작업 번호가 데이터베이스의 기존 레코드와 일치하는지 확인하려고했습니다. 그것은 테이블의 각 레코드를 검토하고 일치하지 않는 모든 레코드에 대해 새로운 작업을 추가했습니다. 나는 jobExctractor 라인을 부울 체크로 대체했고, 체크가 루프 이후에 true를 리턴하면 작업을 추가하지 않았다.

관련 문제