안 드 로 이 드 짧 은 컬러 편지 데이터베이스 디자인 소스 분석 (1)

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/droyon/article/details/8724403
짧 은 컬러 편 지 를 유지 한 지 오래 되 었 습 니 다. 드디어 무엇 을 쓰 고 싶 습 니까? 그럼 데이터 베이스 부터 시작 하 세 요!부당 한 점 은 지적 을 환영 합 니 다.
LEFT 에 대하 여JOIN,INNER_JOIN 등 데이터베이스 지식 으로 W3SCHOOL 을 방문 할 수 있 습 니 다.
MmsSmsDatabaseHelper.java
1. 우선 사유 정적 상수 부터 살 펴 보 자.이 정적 상수 들 은 데이터베이스 트리거 를 구축 하고 데이터 시트 를 구축 할 때 사용 된다.
private static final String SMS_UPDATE_THREAD_READ_BODY =
                        "  UPDATE threads SET read = " +
                        "    CASE (SELECT COUNT(*)" +
                        "          FROM sms" +
                        "          WHERE " + Sms.READ + " = 0" +
                        "            AND " + Sms.THREAD_ID + " = threads._id)" +
                        "      WHEN 0 THEN 1" +
                        "      ELSE 0" +
                        "    END" +
                        "  WHERE threads._id = new." + Sms.THREAD_ID + "; ";
대체적으로 이 렇 습 니 다. 안에 함수 가 하나 박 혀 있 습 니 다. 함수 내용 은 먼저 sms 데이터 시트 에서 Sms. THREAD 를 조회 하 는 것 입 니 다.ID 의 값 은 threads.id 의 모든 줄 은 이 줄 에서 Sms. READ 의 값 이 0 인 줄 을 다시 찾 아 줄 수 를 집계 합 니 다.줄 수가 0 이면 1 을 출력 합 니 다. 그렇지 않 으 면 0 을 출력 합 니 다. 출력 값 을 threads 데이터 시트 에 부여 합 니 다id 값 은 new. Sms. THREADID 에 대응 하 는 줄 의 read 필드 입 니 다.
말하자면 문자 데이터베이스 에 읽 지 않 은 문자 가 있 는 지 확인 하 는 것 이다.
2、
private static final String UPDATE_THREAD_COUNT_ON_NEW =
                        "  UPDATE threads SET message_count = " +
                        "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
                        "      ON threads._id = " + Sms.THREAD_ID +
                        "      WHERE " + Sms.THREAD_ID + " = new.thread_id" +
                        "        AND sms." + Sms.TYPE + " != 3) + " +
                        "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
                        "      ON threads._id = " + Mms.THREAD_ID +
                        "      WHERE " + Mms.THREAD_ID + " = new.thread_id" +
                        "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
                        "        AND " + Mms.MESSAGE_BOX + " != 3) " +
                        "  WHERE threads._id = new.thread_id; ";

검색 체 가 내장 되 어 있 습 니 다.검색 체 의 역할 은 sms 데이터 시트 에서 특정 thread 를 찾 는 것 입 니 다.id 값 이 대응 하고 Sms. TYPE 는 3 (초고 정보의 유형) 의 정보 수량 과 같 지 않 습 니 다.그리고      컬러 편지 데이터 시트 pdu 표 중 특정 threadid 에 대응 하 는 정보, 그리고 정보 유형 은 132 (받 은 컬러 편지, 이미 다운로드 한 컬러 편지 내용 의 유형) 와 130 (받 은 컬러 편지, 다운로드 전의 유형 이 없 음), 128 (보 낸 컬러 편지) 와 같 습 니 다.그리고 messagebox 는 3 (초고 정보의 유형) 과 같 지 않 습 니 다.
말하자면 문자 메시지 와 컬러 메시지 의 데 이 터 를 합 쳐 threads 데이터 시트 에 저장 하 는 messagecount 필드 에 있 습 니 다.
3、
private static final String UPDATE_THREAD_COUNT_ON_OLD =
                        "  UPDATE threads SET message_count = " +
                        "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
                        "      ON threads._id = " + Sms.THREAD_ID +
                        "      WHERE " + Sms.THREAD_ID + " = old.thread_id" +
                        "        AND sms." + Sms.TYPE + " != 3) + " +
                        "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
                        "      ON threads._id = " + Mms.THREAD_ID +
                        "      WHERE " + Mms.THREAD_ID + " = old.thread_id" +
                        "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
                        "        AND " + Mms.MESSAGE_BOX + " != 3) " +
                        "  WHERE threads._id = old.thread_id; ";
위 와 대체적으로 유사 하고 마지막 where 판단 조건 에 있어 서 다르다.
WHERE threads._id = new.thread_id;
WHERE threads._id = old.thread_id;

하나의 new, 하나의 old 는 문 제 를 설명 할 수 있 습 니 다. 즉, 이 두 상수, 하 나 는 새로운 삽입 정 보 를 처리 하고 하 나 는 오래된 정 보 를 처리 하 는 데 사 용 됩 니 다.
4、
private static final String SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE =
                        "BEGIN" +
                        "  UPDATE threads SET" +
                        "    date = (strftime('%s','now') * 1000), " +
                        "    snippet = new." + Sms.BODY + ", " +
                        "    snippet_cs = 0" +
                        "  WHERE threads._id = new." + Sms.THREAD_ID + "; " +
                        UPDATE_THREAD_COUNT_ON_NEW +
                        SMS_UPDATE_THREAD_READ_BODY +
                        "END;";

이 상수 는 새로 업 데 이 트 된 데 이 터 를 처리 하고 threads 데이터 시트 를 업데이트 하 는 date 필드, snippet 필드 (정보 세 션 목록 에서 최신 정 보 를 표시 하 는 부분 알림), snippet 에 사 용 됩 니 다.cs 필드.그리고 우리 가 앞에서 소개 한 두 개의 정적 상수 를 사용 합 니 다.
솔직히 sms 데이터 시트 를 업데이트 할 때 threads 데이터 시트 를 업데이트 합 니 다.
5、
private static final String PDU_UPDATE_THREAD_CONSTRAINTS =
                        "  WHEN new." + Mms.MESSAGE_TYPE + "=" +
                        PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF +
                        "    OR new." + Mms.MESSAGE_TYPE + "=" +
                        PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND +
                        "    OR new." + Mms.MESSAGE_TYPE + "=" +
                        PduHeaders.MESSAGE_TYPE_SEND_REQ + " ";
이 정적 상수 문자열 은 메 시 지 를 보 내 거나 받 은 메 시 지 를 보 내 거나 받 은 메 시 지 를 보 내 거나 데 이 터 를 다운로드 하지 않 은 정보 세 가지 유형 이라는 뜻 이다.
6、
private static final String PDU_UPDATE_THREAD_READ_BODY =
                        "  UPDATE threads SET read = " +
                        "    CASE (SELECT COUNT(*)" +
                        "          FROM " + MmsProvider.TABLE_PDU +
                        "          WHERE " + Mms.READ + " = 0" +
                        "            AND " + Mms.THREAD_ID + " = threads._id " +
                        "            AND (m_type=132 OR m_type=130 OR m_type=128)) " +
                        "      WHEN 0 THEN 1" +
                        "      ELSE 0" +
                        "    END" +
                        "  WHERE threads._id = new." + Mms.THREAD_ID + "; ";
문자 와 마찬가지 로 컬러 편지 에 읽 지 않 은 정보 가 있 는 지 계산 하고 threads 데이터 시트 에 있 으 면 표 지 를 설정 합 니 다.검색 한 컬러 메 시 지 는 5 에서 묘사 한 세 가지 컬러 메 시 지 를 보 내 거나 받 는 것 에 불과 하 다.
7、
private static final String PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE =
                        "BEGIN" +
                        "  UPDATE threads SET" +
                        "    date = (strftime('%s','now') * 1000), " +
                        "    snippet = new." + Mms.SUBJECT + ", " +
                        "    snippet_cs = new." + Mms.SUBJECT_CHARSET +
                        "  WHERE threads._id = new." + Mms.THREAD_ID + "; " +
                        UPDATE_THREAD_COUNT_ON_NEW +
                        PDU_UPDATE_THREAD_READ_BODY +
                        "END;";
문자 메시지 와 마찬가지 로 pdu 표를 업데이트 할 때 threads 표를 업데이트 합 니 다. 그 중에서 date, snippet, snippet 을 업데이트 합 니 다.cs 필드 는 앞에서 정 의 된 정적 상수 도 사용 합 니 다.
8、
private static final String UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE =
                        "  UPDATE threads SET snippet = " +
                        "   (SELECT snippet FROM" +
                        "     (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" +
                        "      UNION SELECT date, body AS snippet, thread_id FROM sms)" +
                        "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
                        "  WHERE threads._id = OLD.thread_id; " +
                        "  UPDATE threads SET snippet_cs = " +
                        "   (SELECT snippet_cs FROM" +
                        "     (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" +
                        "      UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" +
                        "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
                        "  WHERE threads._id = OLD.thread_id; ";
컬러 편지 나 문자 데이터베이스 에서 정보 항목 을 삭제 할 때 세 션 정보 데이터베이스 threads 의 snippet 및 snippet 업데이트cs 필드.
9、
private static final String PART_UPDATE_THREADS_ON_INSERT_TRIGGER =
                        "CREATE TRIGGER update_threads_on_insert_part " +
                        " AFTER INSERT ON part " +
                        " WHEN new.ct != 'text/plain' AND new.ct != 'application/smil' " +
                        " BEGIN " +
                        "  UPDATE threads SET has_attachment=1 WHERE _id IN " +
                        "   (SELECT pdu.thread_id FROM part JOIN pdu ON pdu._id=part.mid " +
                        "     WHERE part._id=new._id LIMIT 1); " +
                        " END";
이 상수 문자열 은 트리거 를 만 들 고 파 트 시트 에 메 시 지 를 삽입 할 때 CONTENTTYPE (ct) 가 "text / plain" 이나 "application / smil" 과 같 지 않 을 때 세 션 표 threads 를 업데이트 하고 표 내 필드 has 를 설정 합 니 다.attachment 가 1 이면 threadid 가 존재 합 니 다.
10、
private static final String PART_UPDATE_THREADS_ON_UPDATE_TRIGGER =
                        "CREATE TRIGGER update_threads_on_update_part " +
                        " AFTER UPDATE of " + Part.MSG_ID + " ON part " +
                        " WHEN new.ct != 'text/plain' AND new.ct != 'application/smil' " +
                        " BEGIN " +
                        "  UPDATE threads SET has_attachment=1 WHERE _id IN " +
                        "   (SELECT pdu.thread_id FROM part JOIN pdu ON pdu._id=part.mid " +
                        "     WHERE part._id=new._id LIMIT 1); " +
                        " END";
이 상수 필드 는 트리거 를 만 드 는 데 사 용 됩 니 다. 내용 은 part 데이터 시트 의 Part. MSG 를 업데이트 하면ID 필드 시, 그리고 CONTENTTYPE 가 text / plain 또는 application / smil 과 같 지 않 을 때 데이터베이스 threads 데이터 시트 를 업데이트 하고 표 내 필드 has 를 설정 합 니 다.attachment = 1, 그리고id 가 존재 할 때.
11、
private static final String PART_UPDATE_THREADS_ON_DELETE_TRIGGER =
                        "CREATE TRIGGER update_threads_on_delete_part " +
                        " AFTER DELETE ON part " +
                        " WHEN old.ct != 'text/plain' AND old.ct != 'application/smil' " +
                        " BEGIN " +
                        "  UPDATE threads SET has_attachment = " +
                        "   CASE " +
                        "    (SELECT COUNT(*) FROM part JOIN pdu " +
                        "     WHERE pdu.thread_id = threads._id " +
                        "     AND part.ct != 'text/plain' AND part.ct != 'application/smil' " +
                        "     AND part.mid = pdu._id)" +
                        "   WHEN 0 THEN 0 " +
                        "   ELSE 1 " +
                        "   END; " +
                        " END";
사용자 가 트리거 를 만 들 고 파 트 시트 의 데 이 터 를 삭제 할 때 ct 즉 CONTENTTYPE 는 text / plain 이나 application / smail 이 아 닐 때 threads 데이터 시트 를 업데이트 하기 시 작 했 습 니 다. where 제한 이 없습니다. 즉, 설정 표 내 에 있 습 니 다.
모든 데이터 의 hasattachment 필드 는 아래 함수 의 출력 값 과 같 습 니 다.
함수 역할: part 표 에 있 는 특정한 part. mid 에 대응 하 는 줄 의 수량 을 조회 합 니 다. 0, 출력 0, 0 이 아니라면 출력 1.
12、
private static final String PDU_UPDATE_THREADS_ON_UPDATE_TRIGGER =
                        "CREATE TRIGGER update_threads_on_update_pdu " +
                        " AFTER UPDATE of thread_id ON pdu " +
                        " BEGIN " +
                        "  UPDATE threads SET has_attachment=1 WHERE _id IN " +
                        "   (SELECT pdu.thread_id FROM part JOIN pdu " +
                        "     WHERE part.ct != 'text/plain' AND part.ct != 'application/smil' " +
                        "     AND part.mid = pdu._id);" +
                        " END";
트리거 를 만 들 고 pdu 데이터 시트 에 있 는 thread 를 업데이트 합 니 다.id 필드, thread 데이터 시트 업데이트 시작, has 설정attchment 필드 는 1 과 같 고 특정한 threadid 존재, 이 특정 threadid 는 업 데 이 트 된 pdu 표 줄 에서id 에 대응 하 는 threadid.
이것 은 데이터베이스 디자인 에 사용 되 는 정적 상수 문자열 로 데이터베이스 생 성 등 을 소개 합 니 다.

좋은 웹페이지 즐겨찾기