| @ -0,0 +1,73 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.micode.notes.data; | ||||||
|  | 
 | ||||||
|  | import android.content.Context; | ||||||
|  | import android.database.Cursor; | ||||||
|  | import android.provider.ContactsContract.CommonDataKinds.Phone; | ||||||
|  | import android.provider.ContactsContract.Data; | ||||||
|  | import android.telephony.PhoneNumberUtils; | ||||||
|  | import android.util.Log; | ||||||
|  | 
 | ||||||
|  | import java.util.HashMap; | ||||||
|  | 
 | ||||||
|  | public class Contact { | ||||||
|  |     private static HashMap<String, String> sContactCache; | ||||||
|  |     private static final String TAG = "Contact"; | ||||||
|  | 
 | ||||||
|  |     private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER | ||||||
|  |     + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" | ||||||
|  |     + " AND " + Data.RAW_CONTACT_ID + " IN " | ||||||
|  |             + "(SELECT raw_contact_id " | ||||||
|  |             + " FROM phone_lookup" | ||||||
|  |             + " WHERE min_match = '+')"; | ||||||
|  | 
 | ||||||
|  |     public static String getContact(Context context, String phoneNumber) { | ||||||
|  |         if(sContactCache == null) { | ||||||
|  |             sContactCache = new HashMap<String, String>(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(sContactCache.containsKey(phoneNumber)) { | ||||||
|  |             return sContactCache.get(phoneNumber); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         String selection = CALLER_ID_SELECTION.replace("+", | ||||||
|  |                 PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); | ||||||
|  |         Cursor cursor = context.getContentResolver().query( | ||||||
|  |                 Data.CONTENT_URI, | ||||||
|  |                 new String [] { Phone.DISPLAY_NAME }, | ||||||
|  |                 selection, | ||||||
|  |                 new String[] { phoneNumber }, | ||||||
|  |                 null); | ||||||
|  | 
 | ||||||
|  |         if (cursor != null && cursor.moveToFirst()) { | ||||||
|  |             try { | ||||||
|  |                 String name = cursor.getString(0); | ||||||
|  |                 sContactCache.put(phoneNumber, name); | ||||||
|  |                 return name; | ||||||
|  |             } catch (IndexOutOfBoundsException e) { | ||||||
|  |                 Log.e(TAG, " Cursor get string error " + e.toString()); | ||||||
|  |                 return null; | ||||||
|  |             } finally { | ||||||
|  |                 cursor.close(); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             Log.d(TAG, "No contact matched with number:" + phoneNumber); | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,187 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.micode.notes.data; | ||||||
|  | 
 | ||||||
|  | import android.content.ContentValues; | ||||||
|  | import android.content.Context; | ||||||
|  | import android.database.sqlite.SQLiteDatabase; | ||||||
|  | import android.database.sqlite.SQLiteOpenHelper; | ||||||
|  | import android.util.Log; | ||||||
|  | 
 | ||||||
|  | import net.micode.notes.data.Notes.DataColumns; | ||||||
|  | import net.micode.notes.data.Notes.DataConstants; | ||||||
|  | import net.micode.notes.data.Notes.NoteColumns; | ||||||
|  | 
 | ||||||
|  | public class NotesDatabaseHelper extends SQLiteOpenHelper { | ||||||
|  |     private static final String DB_NAME = "note.db";  // 数据库名称
 | ||||||
|  | 
 | ||||||
|  |     private static final int DB_VERSION = 4;  // 数据库版本
 | ||||||
|  | 
 | ||||||
|  |     public interface TABLE { | ||||||
|  |         public static final String NOTE = "note";  // 笔记表
 | ||||||
|  |         public static final String DATA = "data";  // 数据表
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static final String TAG = "NotesDatabaseHelper";  // 日志标签
 | ||||||
|  | 
 | ||||||
|  |     private static NotesDatabaseHelper mInstance;  // 单例实例
 | ||||||
|  | 
 | ||||||
|  |     // 创建笔记表的 SQL 语句
 | ||||||
|  |     private static final String CREATE_NOTE_TABLE_SQL = | ||||||
|  |         "CREATE TABLE " + TABLE.NOTE + "(" + | ||||||
|  |             NoteColumns.ID + " INTEGER PRIMARY KEY," + | ||||||
|  |             NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + | ||||||
|  |             NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + | ||||||
|  |             NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + | ||||||
|  |             NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + | ||||||
|  |             NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + | ||||||
|  |             NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + | ||||||
|  |         ")"; | ||||||
|  | 
 | ||||||
|  |     // 创建数据表的 SQL 语句
 | ||||||
|  |     private static final String CREATE_DATA_TABLE_SQL = | ||||||
|  |         "CREATE TABLE " + TABLE.DATA + "(" + | ||||||
|  |             DataColumns.ID + " INTEGER PRIMARY KEY," + | ||||||
|  |             DataColumns.MIME_TYPE + " TEXT NOT NULL," + | ||||||
|  |             DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + | ||||||
|  |             NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + | ||||||
|  |             NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + | ||||||
|  |             DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + | ||||||
|  |             DataColumns.DATA1 + " INTEGER," + | ||||||
|  |             DataColumns.DATA2 + " INTEGER," + | ||||||
|  |             DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + | ||||||
|  |             DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + | ||||||
|  |             DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + | ||||||
|  |         ")"; | ||||||
|  | 
 | ||||||
|  |     // 为数据表创建索引
 | ||||||
|  |     private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = | ||||||
|  |         "CREATE INDEX IF NOT EXISTS note_id_index ON " + | ||||||
|  |         TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:更新文件夹中的笔记数(更新操作时)
 | ||||||
|  |     private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER increase_folder_count_on_update "+ | ||||||
|  |         " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN " + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:更新文件夹中的笔记数(更新操作时)
 | ||||||
|  |     private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER decrease_folder_count_on_update " + | ||||||
|  |         " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN " + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + | ||||||
|  |         "  AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:更新文件夹中的笔记数(插入操作时)
 | ||||||
|  |     private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = | ||||||
|  |         "CREATE TRIGGER increase_folder_count_on_insert " + | ||||||
|  |         " AFTER INSERT ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN " + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:更新文件夹中的笔记数(删除操作时)
 | ||||||
|  |     private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER decrease_folder_count_on_delete " + | ||||||
|  |         " AFTER DELETE ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN " + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + | ||||||
|  |         "  AND " + NoteColumns.NOTES_COUNT + ">0;" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:在插入数据时更新笔记内容
 | ||||||
|  |     private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = | ||||||
|  |         "CREATE TRIGGER update_note_content_on_insert " + | ||||||
|  |         " AFTER INSERT ON " + TABLE.DATA + | ||||||
|  |         " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:在更新数据时更新笔记内容
 | ||||||
|  |     private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER update_note_content_on_update " + | ||||||
|  |         " AFTER UPDATE ON " + TABLE.DATA + | ||||||
|  |         " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:在删除数据时更新笔记内容
 | ||||||
|  |     private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER update_note_content_on_delete " + | ||||||
|  |         " AFTER delete ON " + TABLE.DATA + | ||||||
|  |         " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.SNIPPET + "=''" + | ||||||
|  |         "  WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:在删除笔记时删除关联数据
 | ||||||
|  |     private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER delete_data_on_delete " + | ||||||
|  |         " AFTER DELETE ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  DELETE FROM " + TABLE.DATA + | ||||||
|  |         "   WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:删除文件夹时删除文件夹中的笔记
 | ||||||
|  |     private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = | ||||||
|  |         "CREATE TRIGGER folder_delete_notes_on_delete " + | ||||||
|  |         " AFTER DELETE ON " + TABLE.NOTE + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  DELETE FROM " + TABLE.NOTE + | ||||||
|  |         "   WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + | ||||||
|  |         " END"; | ||||||
|  | 
 | ||||||
|  |     // 触发器:将文件夹中的笔记移动到垃圾桶
 | ||||||
|  |     private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = | ||||||
|  |         "CREATE TRIGGER folder_move_notes_on_trash " + | ||||||
|  |         " AFTER UPDATE ON " + TABLE.NOTE + | ||||||
|  |         " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + | ||||||
|  |         " BEGIN" + | ||||||
|  |         "  UPDATE " + TABLE.NOTE + | ||||||
|  |         "   SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + | ||||||
|  |         "  WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" | ||||||
					Loading…
					
					
				
		Reference in new issue