parent
							
								
									cec6b08fa3
								
							
						
					
					
						commit
						ffd786fc86
					
				| @ -0,0 +1,253 @@ | ||||
| /* | ||||
|  * 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.model; | ||||
| import android.content.ContentProviderOperation;//批量的更新、插入、删除数据
 | ||||
| import android.content.ContentProviderResult;//操作后的结果
 | ||||
| import android.content.ContentUris;//用于添加和获取uri后面的id
 | ||||
| import android.content.ContentValues;//一种用于存储基本数据类型数据的存储机制
 | ||||
| import android.content.Context;//需要用该类来弄清楚调用者的实例
 | ||||
| import android.content.OperationApplicationException;//操作应用程序容错
 | ||||
| import android.net.Uri;//表示待操作的数据
 | ||||
| import android.os.RemoteException;//远程容错
 | ||||
| import android.util.Log;//输出日志,比如说出错、警告等
 | ||||
| 
 | ||||
| import net.micode.notes.data.Notes; | ||||
| import net.micode.notes.data.Notes.CallNote; | ||||
| import net.micode.notes.data.Notes.DataColumns; | ||||
| import net.micode.notes.data.Notes.NoteColumns; | ||||
| import net.micode.notes.data.Notes.TextNote; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| 
 | ||||
| 
 | ||||
| public class Note { | ||||
|     private ContentValues mNoteDiffValues; | ||||
|     private NoteData mNoteData; | ||||
|     private static final String TAG = "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
 | ||||
|         ContentValues values = new ContentValues(); | ||||
|         long createdTime = System.currentTimeMillis(); | ||||
|         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);//将数据写入数据库表格
 | ||||
|         Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); | ||||
| //ContentResolver()主要是实现外部应用对ContentProvider中的数据
 | ||||
| //进行添加、删除、修改和查询操作
 | ||||
|         long noteId = 0; | ||||
|         try { | ||||
|             noteId = Long.valueOf(uri.getPathSegments().get(1)); | ||||
|         } catch (NumberFormatException e) { | ||||
|             Log.e(TAG, "Get note id error :" + e.toString()); | ||||
|             noteId = 0; | ||||
|         }//try-catch异常处理
 | ||||
|         if (noteId == -1) { | ||||
|             throw new IllegalStateException("Wrong note id:" + noteId); | ||||
|         } | ||||
|         return noteId; | ||||
|     } | ||||
| 
 | ||||
|     public Note() { | ||||
|         mNoteDiffValues = new ContentValues(); | ||||
|         mNoteData = new NoteData(); | ||||
|     }//定义两个变量用来存储便签的数据,一个是存储便签属性,一个是存储便签内容
 | ||||
| 
 | ||||
|     public void setNoteValue(String key, String value) { | ||||
|         mNoteDiffValues.put(key, value); | ||||
|         mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | ||||
|         mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | ||||
|     }//设置数据库表格的标签属性数据
 | ||||
| 
 | ||||
|     public void setTextData(String key, String value) { | ||||
|         mNoteData.setTextData(key, value); | ||||
|     }//设置数据库表格的标签文本内容的数据
 | ||||
| 
 | ||||
|     public void setTextDataId(long id) { | ||||
|        mNoteData.setTextDataId(id); | ||||
|     }//设置文本数据的id
 | ||||
|     public long getTextDataId() { | ||||
|         return mNoteData.mTextDataId; | ||||
|     }//得到文本数据的id
 | ||||
| 
 | ||||
|     public void setCallDataId(long id) { | ||||
|         mNoteData.setCallDataId(id); | ||||
|     }//设置电话号码数据的id
 | ||||
| 
 | ||||
|     public void setCallData(String key, String value) { | ||||
|         mNoteData.setCallData(key, value); | ||||
|     }//得到电话号码数据的id
 | ||||
| 
 | ||||
|     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); | ||||
|         } | ||||
| 
 | ||||
|         if (!isLocalModified()) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and | ||||
|          * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the | ||||
|          * note data info | ||||
|          */ | ||||
|         if (context.getContentResolver().update( | ||||
|                 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, | ||||
|                 null) == 0) { | ||||
|             Log.e(TAG, "Update note error, should not happen"); | ||||
|             // Do not return, fall through
 | ||||
|         } | ||||
|         mNoteDiffValues.clear(); | ||||
| 
 | ||||
|         if (mNoteData.isLocalModified() | ||||
|                 && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return true; | ||||
|     }//判断数据是否同步
 | ||||
| 
 | ||||
|     private class NoteData {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据
 | ||||
|         private long mTextDataId; | ||||
| 
 | ||||
|         private ContentValues mTextDataValues;//文本数据
 | ||||
| 
 | ||||
|         private long mCallDataId; | ||||
| 
 | ||||
|         private ContentValues mCallDataValues;//电话号码数据
 | ||||
| 
 | ||||
|         private static final String TAG = "NoteData"; | ||||
| 
 | ||||
|         public NoteData() { | ||||
|             mTextDataValues = new ContentValues(); | ||||
|             mCallDataValues = new ContentValues(); | ||||
|             mTextDataId = 0; | ||||
|             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; | ||||
|         } | ||||
| 
 | ||||
|         void setCallDataId(long id) { | ||||
|             if (id <= 0) { | ||||
|                 throw new IllegalArgumentException("Call data id should larger than 0"); | ||||
|             } | ||||
|             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()); | ||||
|         } | ||||
| //下面函数的作用是将新的数据通过uri的操作存储到数据库
 | ||||
|         Uri pushIntoContentResolver(Context context, long noteId) { | ||||
|             /** | ||||
|              * Check for safety | ||||
|              */ | ||||
|             if (noteId <= 0) { | ||||
|                 throw new IllegalArgumentException("Wrong note id:" + noteId); | ||||
|             }//判断数据是否合法
 | ||||
| 
 | ||||
|             ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); | ||||
|             ContentProviderOperation.Builder builder = null;//数据库的操作列表
 | ||||
| 
 | ||||
|             if(mTextDataValues.size() > 0) { | ||||
|                 mTextDataValues.put(DataColumns.NOTE_ID, noteId); | ||||
|                 if (mTextDataId == 0) { | ||||
|                     mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); | ||||
|                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | ||||
|                             mTextDataValues); | ||||
|                     try { | ||||
|                         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 { | ||||
|                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | ||||
|                             Notes.CONTENT_DATA_URI, mTextDataId)); | ||||
|                     builder.withValues(mTextDataValues); | ||||
|                     operationList.add(builder.build()); | ||||
|                 } | ||||
|                 mTextDataValues.clear(); | ||||
|             }//把文本数据存入DataColumns
 | ||||
| 
 | ||||
|             if(mCallDataValues.size() > 0) { | ||||
|                 mCallDataValues.put(DataColumns.NOTE_ID, noteId); | ||||
|                 if (mCallDataId == 0) { | ||||
|                     mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); | ||||
|                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | ||||
|                             mCallDataValues); | ||||
|                     try { | ||||
|                         setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); | ||||
|                     } catch (NumberFormatException e) { | ||||
|                         Log.e(TAG, "Insert new call data fail with noteId" + noteId); | ||||
|                         mCallDataValues.clear(); | ||||
|                         return null; | ||||
|                     } | ||||
|                 } else { | ||||
|                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | ||||
|                             Notes.CONTENT_DATA_URI, mCallDataId)); | ||||
|                     builder.withValues(mCallDataValues); | ||||
|                     operationList.add(builder.build()); | ||||
|                 } | ||||
|                 mCallDataValues.clear(); | ||||
|             }//吧电话号码数据存入DataColumns
 | ||||
| 
 | ||||
|             if (operationList.size() > 0) { | ||||
|                 try { | ||||
|                     ContentProviderResult[] results = context.getContentResolver().applyBatch( | ||||
|                             Notes.AUTHORITY, operationList); | ||||
|                     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; | ||||
|                 } | ||||
|             }//存储过程中的异常处理
 | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue