|  |  |  | @ -1,4 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  |  | /*su | 
			
		
	
		
			
				
					|  |  |  |  | /* | 
			
		
	
		
			
				
					|  |  |  |  |  * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
			
		
	
	
		
			
				
					|  |  |  | @ -42,11 +42,11 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |      * Create a new note id for adding a new note to databases | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public static synchronized long getNewNoteId(Context context, long folderId) { | 
			
		
	
		
			
				
					|  |  |  |  |         // Create a new note in the database
 | 
			
		
	
		
			
				
					|  |  |  |  |         //为给定文件夹生成新的笔记ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         ContentValues values = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |         long createdTime = System.currentTimeMillis(); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.CREATED_DATE, createdTime); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.MODIFIED_DATE, createdTime); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.CREATED_DATE, createdTime);//创建日期
 | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.MODIFIED_DATE, createdTime);//修改日期
 | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.PARENT_ID, folderId); | 
			
		
	
	
		
			
				
					|  |  |  | @ -71,6 +71,7 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setNoteValue(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         //此方法设置笔记的值,标记为本地修改
 | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
	
		
			
				
					|  |  |  | @ -79,11 +80,12 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextData(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     //为笔记设置文本数据。
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextDataId(id); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     //setTextDataId、getTextDataId、setCallDataId、setCallData ,这些方法处理与笔记相关的文本和通话信息的ID和数据的设置和获取。
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getTextDataId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteData.mTextDataId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  |  | @ -99,7 +101,7 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     //根据值和数据的差异检查笔记是否具有本地修改。
 | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean syncNote(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (noteId <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalArgumentException("Wrong note id:" + noteId); | 
			
		
	
	
		
			
				
					|  |  |  | @ -108,6 +110,8 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!isLocalModified()) { | 
			
		
	
		
			
				
					|  |  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         //尝试将笔记与提供的上下文和笔记ID同步。
 | 
			
		
	
		
			
				
					|  |  |  |  |         //如果笔记ID小于或等于0,或者没有本地修改,则返回true。
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and | 
			
		
	
	
		
			
				
					|  |  |  | @ -147,17 +151,19 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         //初始化 mTextDataValues 和 mCallDataValues 为 ContentValues 对象,用于存储文本数据和通话数据。
 | 
			
		
	
		
			
				
					|  |  |  |  |         //初始化 mTextDataId 和 mCallDataId 为 0。
 | 
			
		
	
		
			
				
					|  |  |  |  |         boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |             return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         //检查文本或通话数据是否有本地修改
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if(id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Text data id should larger than 0"); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         //设置文本数据的ID,如果提供的ID小于等于0,报告异常
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (id <= 0) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -165,52 +171,57 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         //设置通话数据的键值对,并标记笔记为本地修改,更新修改日期
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         //设置文本数据的键值对,并标记笔记为本地修改,更新修改日期
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         //将数据推送到ContentResolver的方法
 | 
			
		
	
		
			
				
					|  |  |  |  |         Uri pushIntoContentResolver(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * Check for safety | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             //检查noteID的有效性,如果小于等于0,抛出IllegalArgumentException
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (noteId <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Wrong note id:" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             //用于保存ContentProvider操作列表
 | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); | 
			
		
	
		
			
				
					|  |  |  |  |             ContentProviderOperation.Builder builder = null; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             //处理文本数据的操作
 | 
			
		
	
		
			
				
					|  |  |  |  |             if(mTextDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 //设置文本数据的关联noteID
 | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.put(DataColumns.NOTE_ID, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 如果mTextDataId为0,表示需要插入新的文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mTextDataId == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                     mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); | 
			
		
	
		
			
				
					|  |  |  |  |                     //插入数据并获取新的Uri
 | 
			
		
	
		
			
				
					|  |  |  |  |                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | 
			
		
	
		
			
				
					|  |  |  |  |                             mTextDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     try { | 
			
		
	
		
			
				
					|  |  |  |  |                         // 解析Uri中的数据,获取新插入数据的id,并设置给mTextDataId
 | 
			
		
	
		
			
				
					|  |  |  |  |                         setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); | 
			
		
	
		
			
				
					|  |  |  |  |                     } catch (NumberFormatException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                         // 插入数据失败,记录错误日志并清空数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                         Log.e(TAG, "Insert new text data fail with noteId" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                         mTextDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |                         return null; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                     // mTextDataId不为0,表示需要更新已存在的文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.CONTENT_DATA_URI, mTextDataId)); | 
			
		
	
		
			
				
					|  |  |  |  |                     builder.withValues(mTextDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     operationList.add(builder.build()); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 // 清空文本数据,以便下一次使用
 | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // 处理通话数据的操作,逻辑类似于文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |             if(mCallDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.put(DataColumns.NOTE_ID, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mCallDataId == 0) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -232,17 +243,20 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // 如果有待执行的操作,将它们应用到ContentResolver
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (operationList.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 try { | 
			
		
	
		
			
				
					|  |  |  |  |                     ContentProviderResult[] results = context.getContentResolver().applyBatch( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.AUTHORITY, operationList); | 
			
		
	
		
			
				
					|  |  |  |  |                     // 返回插入或更新后的笔记的Uri,如果操作失败则返回null
 | 
			
		
	
		
			
				
					|  |  |  |  |                     return (results == null || results.length == 0 || results[0] == null) ? null | 
			
		
	
		
			
				
					|  |  |  |  |                             : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 } catch (RemoteException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 捕获远程异常并记录错误日志
 | 
			
		
	
		
			
				
					|  |  |  |  |                     Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); | 
			
		
	
		
			
				
					|  |  |  |  |                     return null; | 
			
		
	
		
			
				
					|  |  |  |  |                 } catch (OperationApplicationException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 捕获操作应用异常并记录错误日志
 | 
			
		
	
		
			
				
					|  |  |  |  |                     Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); | 
			
		
	
		
			
				
					|  |  |  |  |                     return null; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
	
		
			
				
					|  |  |  | @ -251,3 +265,5 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |