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.

526 lines
37 KiB

<html>
<head>
<title>SqlNote.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: #1750eb;}
.s4 { color: #067d17;}
</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">
SqlNote.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.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</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.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</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.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.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">import </span><span class="s1">org.json.JSONArray;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">public class </span><span class="s1">SqlNote {</span>
<span class="s2">private static final </span><span class="s1">String TAG = SqlNote.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private static final int </span><span class="s1">INVALID_ID = -</span><span class="s3">99999</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String[] PROJECTION_NOTE = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE,</span>
<span class="s1">NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE,</span>
<span class="s1">NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID,</span>
<span class="s1">NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,</span>
<span class="s1">NoteColumns.VERSION</span>
<span class="s1">};</span>
<span class="s2">public static final int </span><span class="s1">ID_COLUMN = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ALERTED_DATE_COLUMN = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">BG_COLOR_ID_COLUMN = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">CREATED_DATE_COLUMN = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">HAS_ATTACHMENT_COLUMN = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">MODIFIED_DATE_COLUMN = </span><span class="s3">5</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">NOTES_COUNT_COLUMN = </span><span class="s3">6</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">PARENT_ID_COLUMN = </span><span class="s3">7</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SNIPPET_COLUMN = </span><span class="s3">8</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_COLUMN = </span><span class="s3">9</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">WIDGET_ID_COLUMN = </span><span class="s3">10</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">WIDGET_TYPE_COLUMN = </span><span class="s3">11</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ID_COLUMN = </span><span class="s3">12</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">LOCAL_MODIFIED_COLUMN = </span><span class="s3">13</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ORIGIN_PARENT_ID_COLUMN = </span><span class="s3">14</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">GTASK_ID_COLUMN = </span><span class="s3">15</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">VERSION_COLUMN = </span><span class="s3">16</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private </span><span class="s1">ContentResolver mContentResolver;</span>
<span class="s2">private boolean </span><span class="s1">mIsCreate;</span>
<span class="s2">private long </span><span class="s1">mId;</span>
<span class="s2">private long </span><span class="s1">mAlertDate;</span>
<span class="s2">private int </span><span class="s1">mBgColorId;</span>
<span class="s2">private long </span><span class="s1">mCreatedDate;</span>
<span class="s2">private int </span><span class="s1">mHasAttachment;</span>
<span class="s2">private long </span><span class="s1">mModifiedDate;</span>
<span class="s2">private long </span><span class="s1">mParentId;</span>
<span class="s2">private </span><span class="s1">String mSnippet;</span>
<span class="s2">private int </span><span class="s1">mType;</span>
<span class="s2">private int </span><span class="s1">mWidgetId;</span>
<span class="s2">private int </span><span class="s1">mWidgetType;</span>
<span class="s2">private long </span><span class="s1">mOriginParent;</span>
<span class="s2">private long </span><span class="s1">mVersion;</span>
<span class="s2">private </span><span class="s1">ContentValues mDiffNoteValues;</span>
<span class="s2">private </span><span class="s1">ArrayList&lt;SqlData&gt; mDataList;</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">mId = INVALID_ID;</span>
<span class="s1">mAlertDate = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mBgColorId = ResourceParser.getDefaultBgId(context);</span>
<span class="s1">mCreatedDate = System.currentTimeMillis();</span>
<span class="s1">mHasAttachment = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mModifiedDate = System.currentTimeMillis();</span>
<span class="s1">mParentId = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mSnippet = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mType = Notes.TYPE_NOTE;</span>
<span class="s1">mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;</span>
<span class="s1">mWidgetType = Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s1">mOriginParent = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mVersion = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context, Cursor c) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">loadFromCursor(c);</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context, </span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">loadFromCursor(id);</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadFromCursor(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, </span><span class="s4">&quot;(_id=?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(id)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.moveToNext();</span>
<span class="s1">loadFromCursor(c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;loadFromCursor: cursor = null&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadFromCursor(Cursor c) {</span>
<span class="s1">mId = c.getLong(ID_COLUMN);</span>
<span class="s1">mAlertDate = c.getLong(ALERTED_DATE_COLUMN);</span>
<span class="s1">mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);</span>
<span class="s1">mCreatedDate = c.getLong(CREATED_DATE_COLUMN);</span>
<span class="s1">mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN);</span>
<span class="s1">mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN);</span>
<span class="s1">mParentId = c.getLong(PARENT_ID_COLUMN);</span>
<span class="s1">mSnippet = c.getString(SNIPPET_COLUMN);</span>
<span class="s1">mType = c.getInt(TYPE_COLUMN);</span>
<span class="s1">mWidgetId = c.getInt(WIDGET_ID_COLUMN);</span>
<span class="s1">mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);</span>
<span class="s1">mVersion = c.getLong(VERSION_COLUMN);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadDataContent() {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mDataList.clear();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,</span>
<span class="s4">&quot;(note_id=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(c.getCount() == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;it seems that the note has not data&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">SqlData data = </span><span class="s2">new </span><span class="s1">SqlData(mContext, c);</span>
<span class="s1">mDataList.add(data);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;loadDataContent: cursor = null&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">setContent(JSONObject js) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s2">if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;cannot set system folder&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {</span>
<span class="s0">// for folder we can only update the snnipet and type</span>
<span class="s1">String snippet = note.has(NoteColumns.SNIPPET) ? note</span>
<span class="s1">.getString(NoteColumns.SNIPPET) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mSnippet.equals(snippet)) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);</span>
<span class="s1">}</span>
<span class="s1">mSnippet = snippet;</span>
<span class="s2">int </span><span class="s1">type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)</span>
<span class="s1">: Notes.TYPE_NOTE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mType != type) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.TYPE, type);</span>
<span class="s1">}</span>
<span class="s1">mType = type;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {</span>
<span class="s1">JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);</span>
<span class="s2">long </span><span class="s1">id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mId != id) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ID, id);</span>
<span class="s1">}</span>
<span class="s1">mId = id;</span>
<span class="s2">long </span><span class="s1">alertDate = note.has(NoteColumns.ALERTED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.ALERTED_DATE) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mAlertDate != alertDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate);</span>
<span class="s1">}</span>
<span class="s1">mAlertDate = alertDate;</span>
<span class="s2">int </span><span class="s1">bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note</span>
<span class="s1">.getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext);</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mBgColorId != bgColorId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId);</span>
<span class="s1">}</span>
<span class="s1">mBgColorId = bgColorId;</span>
<span class="s2">long </span><span class="s1">createDate = note.has(NoteColumns.CREATED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis();</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mCreatedDate != createDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate);</span>
<span class="s1">}</span>
<span class="s1">mCreatedDate = createDate;</span>
<span class="s2">int </span><span class="s1">hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note</span>
<span class="s1">.getInt(NoteColumns.HAS_ATTACHMENT) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mHasAttachment != hasAttachment) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment);</span>
<span class="s1">}</span>
<span class="s1">mHasAttachment = hasAttachment;</span>
<span class="s2">long </span><span class="s1">modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis();</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mModifiedDate != modifiedDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate);</span>
<span class="s1">}</span>
<span class="s1">mModifiedDate = modifiedDate;</span>
<span class="s2">long </span><span class="s1">parentId = note.has(NoteColumns.PARENT_ID) ? note</span>
<span class="s1">.getLong(NoteColumns.PARENT_ID) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mParentId != parentId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId);</span>
<span class="s1">}</span>
<span class="s1">mParentId = parentId;</span>
<span class="s1">String snippet = note.has(NoteColumns.SNIPPET) ? note</span>
<span class="s1">.getString(NoteColumns.SNIPPET) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mSnippet.equals(snippet)) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);</span>
<span class="s1">}</span>
<span class="s1">mSnippet = snippet;</span>
<span class="s2">int </span><span class="s1">type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)</span>
<span class="s1">: Notes.TYPE_NOTE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mType != type) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.TYPE, type);</span>
<span class="s1">}</span>
<span class="s1">mType = type;</span>
<span class="s2">int </span><span class="s1">widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID)</span>
<span class="s1">: AppWidgetManager.INVALID_APPWIDGET_ID;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mWidgetId != widgetId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId);</span>
<span class="s1">}</span>
<span class="s1">mWidgetId = widgetId;</span>
<span class="s2">int </span><span class="s1">widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note</span>
<span class="s1">.getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mWidgetType != widgetType) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType);</span>
<span class="s1">}</span>
<span class="s1">mWidgetType = widgetType;</span>
<span class="s2">long </span><span class="s1">originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note</span>
<span class="s1">.getLong(NoteColumns.ORIGIN_PARENT_ID) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mOriginParent != originParent) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent);</span>
<span class="s1">}</span>
<span class="s1">mOriginParent = originParent;</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; dataArray.length(); i++) {</span>
<span class="s1">JSONObject data = dataArray.getJSONObject(i);</span>
<span class="s1">SqlData sqlData = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(data.has(DataColumns.ID)) {</span>
<span class="s2">long </span><span class="s1">dataId = data.getLong(DataColumns.ID);</span>
<span class="s2">for </span><span class="s1">(SqlData temp : mDataList) {</span>
<span class="s2">if </span><span class="s1">(dataId == temp.getId()) {</span>
<span class="s1">sqlData = temp;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(sqlData == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">sqlData = </span><span class="s2">new </span><span class="s1">SqlData(mContext);</span>
<span class="s1">mDataList.add(sqlData);</span>
<span class="s1">}</span>
<span class="s1">sqlData.setContent(data);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</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">public </span><span class="s1">JSONObject getContent() {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;it seems that we haven't created this in database yet&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">JSONObject note = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s1">note.put(NoteColumns.ID, mId);</span>
<span class="s1">note.put(NoteColumns.ALERTED_DATE, mAlertDate);</span>
<span class="s1">note.put(NoteColumns.BG_COLOR_ID, mBgColorId);</span>
<span class="s1">note.put(NoteColumns.CREATED_DATE, mCreatedDate);</span>
<span class="s1">note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment);</span>
<span class="s1">note.put(NoteColumns.MODIFIED_DATE, mModifiedDate);</span>
<span class="s1">note.put(NoteColumns.PARENT_ID, mParentId);</span>
<span class="s1">note.put(NoteColumns.SNIPPET, mSnippet);</span>
<span class="s1">note.put(NoteColumns.TYPE, mType);</span>
<span class="s1">note.put(NoteColumns.WIDGET_ID, mWidgetId);</span>
<span class="s1">note.put(NoteColumns.WIDGET_TYPE, mWidgetType);</span>
<span class="s1">note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, note);</span>
<span class="s1">JSONArray dataArray = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">JSONObject data = sqlData.getContent();</span>
<span class="s2">if </span><span class="s1">(data != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">dataArray.put(data);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {</span>
<span class="s1">note.put(NoteColumns.ID, mId);</span>
<span class="s1">note.put(NoteColumns.TYPE, mType);</span>
<span class="s1">note.put(NoteColumns.SNIPPET, mSnippet);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, note);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setParentId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mParentId = id;</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.PARENT_ID, id);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setGtaskId(String gid) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setSyncId(</span><span class="s2">long </span><span class="s1">syncId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">resetLocalModified() {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s3">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getId() {</span>
<span class="s2">return </span><span class="s1">mId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getParentId() {</span>
<span class="s2">return </span><span class="s1">mParentId;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getSnippet() {</span>
<span class="s2">return </span><span class="s1">mSnippet;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isNoteType() {</span>
<span class="s2">return </span><span class="s1">mType == Notes.TYPE_NOTE;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">commit(</span><span class="s2">boolean </span><span class="s1">validateVersion) {</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s2">if </span><span class="s1">(mId == INVALID_ID &amp;&amp; mDiffNoteValues.containsKey(NoteColumns.ID)) {</span>
<span class="s1">mDiffNoteValues.remove(NoteColumns.ID);</span>
<span class="s1">}</span>
<span class="s1">Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mId = Long.valueOf(uri.getPathSegments().get(</span><span class="s3">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="s4">&quot;Get note id error :&quot; </span><span class="s1">+ e.toString());</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;create note failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mId == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">&quot;Create thread id failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">sqlData.commit(mId, </span><span class="s2">false</span><span class="s1">, -</span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(mId &lt;= </span><span class="s3">0 </span><span class="s1">&amp;&amp; mId != Notes.ID_ROOT_FOLDER &amp;&amp; mId != Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;No such note&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">&quot;Try to update note with invalid id&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mDiffNoteValues.size() &gt; </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">mVersion ++;</span>
<span class="s2">int </span><span class="s1">result = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(!validateVersion) {</span>
<span class="s1">result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, </span><span class="s4">&quot;(&quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s4">&quot;=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId)</span>
<span class="s1">});</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, </span><span class="s4">&quot;(&quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s4">&quot;=?) AND (&quot; </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s4">&quot;&lt;=?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId), String.valueOf(mVersion)</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(result == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;there is no update. maybe user updates note when syncing&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">sqlData.commit(mId, validateVersion, mVersion);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// refresh local info</span>
<span class="s1">loadFromCursor(mId);</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues.clear();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>