You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
20 KiB

<html>
<head>
<title>Note.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Note.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.model;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderOperation;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderResult;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.OperationApplicationException;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.os.RemoteException;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.CallNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.TextNote;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">public class </span><span class="s1">Note {</span>
<span class="s2">private </span><span class="s1">ContentValues mNoteDiffValues;</span>
<span class="s2">private </span><span class="s1">NoteData mNoteData;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;Note&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Create a new note id for adding a new note to databases</span>
<span class="s0">*/</span>
<span class="s2">public static synchronized long </span><span class="s1">getNewNoteId(Context context, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s0">// Create a new note in the database</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s2">long </span><span class="s1">createdTime = System.currentTimeMillis();</span>
<span class="s1">values.put(NoteColumns.CREATED_DATE, createdTime);</span>
<span class="s1">values.put(NoteColumns.MODIFIED_DATE, createdTime);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);</span>
<span class="s1">values.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">values.put(NoteColumns.PARENT_ID, folderId);</span><span class="s0">//将数据写入数据库表格</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);</span>
<span class="s0">//ContentResolver()主要是实现外部应用对ContentProvider中的数据</span>
<span class="s0">//进行添加、删除、修改和查询操作</span>
<span class="s2">long </span><span class="s1">noteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">noteId = Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Get note id error :&quot; </span><span class="s1">+ e.toString());</span>
<span class="s1">noteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span><span class="s0">//try-catch异常处理</span>
<span class="s2">if </span><span class="s1">(noteId == -</span><span class="s4">1</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">noteId;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Note() {</span>
<span class="s1">mNoteDiffValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mNoteData = </span><span class="s2">new </span><span class="s1">NoteData();</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setNoteValue(String key, String value) {</span>
<span class="s1">mNoteDiffValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setTextData(String key, String value) {</span>
<span class="s1">mNoteData.setTextData(key, value);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setTextDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mNoteData.setTextDataId(id);</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getTextDataId() {</span>
<span class="s2">return </span><span class="s1">mNoteData.mTextDataId;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCallDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mNoteData.setCallDataId(id);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCallData(String key, String value) {</span>
<span class="s1">mNoteData.setCallData(key, value);</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isLocalModified() {</span>
<span class="s2">return </span><span class="s1">mNoteDiffValues.size() &gt; </span><span class="s4">0 </span><span class="s1">|| mNoteData.isLocalModified();</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">syncNote(Context context, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s2">if </span><span class="s1">(noteId &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!isLocalModified()) {</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* In theory, once data changed, the note should be updated on {</span><span class="s5">@link </span><span class="s0">NoteColumns#LOCAL_MODIFIED} and</span>
<span class="s0">* {</span><span class="s5">@link </span><span class="s0">NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the</span>
<span class="s0">* note data info</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(context.getContentResolver().update(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s2">null</span><span class="s1">) == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Update note error, should not happen&quot;</span><span class="s1">);</span>
<span class="s0">// Do not return, fall through</span>
<span class="s1">}</span>
<span class="s1">mNoteDiffValues.clear();</span>
<span class="s2">if </span><span class="s1">(mNoteData.isLocalModified()</span>
<span class="s1">&amp;&amp; (mNoteData.pushIntoContentResolver(context, noteId) == </span><span class="s2">null</span><span class="s1">)) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private class </span><span class="s1">NoteData {</span>
<span class="s2">private long </span><span class="s1">mTextDataId;</span>
<span class="s2">private </span><span class="s1">ContentValues mTextDataValues;</span>
<span class="s2">private long </span><span class="s1">mCallDataId;</span>
<span class="s2">private </span><span class="s1">ContentValues mCallDataValues;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NoteData&quot;</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">NoteData() {</span>
<span class="s1">mTextDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mCallDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mTextDataId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mCallDataId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">boolean </span><span class="s1">isLocalModified() {</span>
<span class="s2">return </span><span class="s1">mTextDataValues.size() &gt; </span><span class="s4">0 </span><span class="s1">|| mCallDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setTextDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">if</span><span class="s1">(id &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Text data id should larger than 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mTextDataId = id;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setCallDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Call data id should larger than 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mCallDataId = id;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setCallData(String key, String value) {</span>
<span class="s1">mCallDataValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setTextData(String key, String value) {</span>
<span class="s1">mTextDataValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s1">Uri pushIntoContentResolver(Context context, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s0">/**</span>
<span class="s0">* Check for safety</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(noteId &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s1">ArrayList&lt;ContentProviderOperation&gt; operationList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;ContentProviderOperation&gt;();</span>
<span class="s1">ContentProviderOperation.Builder builder = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(mTextDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mTextDataValues.put(DataColumns.NOTE_ID, noteId);</span>
<span class="s2">if </span><span class="s1">(mTextDataId == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,</span>
<span class="s1">mTextDataValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">setTextDataId(Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">)));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Insert new text data fail with noteId&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">mTextDataValues.clear();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mTextDataId));</span>
<span class="s1">builder.withValues(mTextDataValues);</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s1">mTextDataValues.clear();</span>
<span class="s1">}</span>
<span class="s2">if</span><span class="s1">(mCallDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mCallDataValues.put(DataColumns.NOTE_ID, noteId);</span>
<span class="s2">if </span><span class="s1">(mCallDataId == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE);</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,</span>
<span class="s1">mCallDataValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">setCallDataId(Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">)));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Insert new call data fail with noteId&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">mCallDataValues.clear();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mCallDataId));</span>
<span class="s1">builder.withValues(mCallDataValues);</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s1">mCallDataValues.clear();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(operationList.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">ContentProviderResult[] results = context.getContentResolver().applyBatch(</span>
<span class="s1">Notes.AUTHORITY, operationList);</span>
<span class="s2">return </span><span class="s1">(results == </span><span class="s2">null </span><span class="s1">|| results.length == </span><span class="s4">0 </span><span class="s1">|| results[</span><span class="s4">0</span><span class="s1">] == </span><span class="s2">null</span><span class="s1">) ? </span><span class="s2">null</span>
<span class="s1">: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(RemoteException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(OperationApplicationException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>