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.
gitProject1/01src/net/micode/notes/data/NotesDatabaseHelper.java.html

384 lines
33 KiB

<html>
<head>
<title>NotesDatabaseHelper.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">
NotesDatabaseHelper.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.data;</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.sqlite.SQLiteDatabase;</span>
<span class="s2">import </span><span class="s1">android.database.sqlite.SQLiteOpenHelper;</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.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">public class </span><span class="s1">NotesDatabaseHelper </span><span class="s2">extends </span><span class="s1">SQLiteOpenHelper {</span>
<span class="s2">private static final </span><span class="s1">String DB_NAME = </span><span class="s3">&quot;note.db&quot;</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DB_VERSION = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">public interface </span><span class="s1">TABLE {</span>
<span class="s2">public static final </span><span class="s1">String NOTE = </span><span class="s3">&quot;note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String DATA = </span><span class="s3">&quot;data&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NotesDatabaseHelper&quot;</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">NotesDatabaseHelper mInstance;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_NOTE_TABLE_SQL =</span>
<span class="s3">&quot;CREATE TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot;(&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ID + </span><span class="s3">&quot; INTEGER PRIMARY KEY,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.PARENT_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ALERTED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.BG_COLOR_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.HAS_ATTACHMENT + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.SNIPPET + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.WIDGET_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.WIDGET_TYPE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT -1,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.SYNC_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.LOCAL_MODIFIED + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ORIGIN_PARENT_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.GTASK_ID + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.VERSION + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0&quot; </span><span class="s1">+</span>
<span class="s3">&quot;)&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_DATA_TABLE_SQL =</span>
<span class="s3">&quot;CREATE TABLE &quot; </span><span class="s1">+ TABLE.DATA + </span><span class="s3">&quot;(&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.ID + </span><span class="s3">&quot; INTEGER PRIMARY KEY,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.MIME_TYPE + </span><span class="s3">&quot; TEXT NOT NULL,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.NOTE_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.CONTENT + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA1 + </span><span class="s3">&quot; INTEGER,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA2 + </span><span class="s3">&quot; INTEGER,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA3 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA4 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA5 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT ''&quot; </span><span class="s1">+</span>
<span class="s3">&quot;)&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_DATA_NOTE_ID_INDEX_SQL =</span>
<span class="s3">&quot;CREATE INDEX IF NOT EXISTS note_id_index ON &quot; </span><span class="s1">+</span>
<span class="s1">TABLE.DATA + </span><span class="s3">&quot;(&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;);&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Increase folder's note count when move note to the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER increase_folder_count_on_update &quot;</span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE OF &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot; ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; + 1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Decrease folder's note count when move note from folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER decrease_folder_count_on_update &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE OF &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot; ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;-1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;&gt;0&quot; </span><span class="s1">+ </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Increase folder's note count when insert new note to the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER increase_folder_count_on_insert &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER INSERT ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; + 1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Decrease folder's note count when delete note from the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER decrease_folder_count_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;-1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;&gt;0;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when insert data with type {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE}</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_insert &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER INSERT ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN new.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.CONTENT +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when data with {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE} type has changed</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_update &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN old.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.CONTENT +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when data with {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE} type has deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER delete ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN old.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=''&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Delete datas belong to note which has been deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER delete_data_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; DELETE FROM &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Delete notes belong to folder which has been deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER folder_delete_notes_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; DELETE FROM &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Move notes belong to folder which has been moved to trash folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER folder_move_notes_on_trash &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; WHEN new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">NotesDatabaseHelper(Context context) {</span>
<span class="s2">super</span><span class="s1">(context, DB_NAME, </span><span class="s2">null</span><span class="s1">, DB_VERSION);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createNoteTable(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(CREATE_NOTE_TABLE_SQL);</span>
<span class="s1">reCreateNoteTableTriggers(db);</span>
<span class="s1">createSystemFolder(db);</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;note table has been created&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">reCreateNoteTableTriggers(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS increase_folder_count_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS decrease_folder_count_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS decrease_folder_count_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS delete_data_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS increase_folder_count_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS folder_delete_notes_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS folder_move_notes_on_trash&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);</span>
<span class="s1">db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">createSystemFolder(SQLiteDatabase db) {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s0">/**</span>
<span class="s0">* call record foler for call notes</span>
<span class="s0">*/</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* root folder which is default folder</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* temporary folder which is used for moving note</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* create trash folder</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createDataTable(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(CREATE_DATA_TABLE_SQL);</span>
<span class="s1">reCreateDataTableTriggers(db);</span>
<span class="s1">db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;data table has been created&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">reCreateDataTableTriggers(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);</span>
<span class="s1">}</span>
<span class="s2">static synchronized </span><span class="s1">NotesDatabaseHelper getInstance(Context context) {</span>
<span class="s2">if </span><span class="s1">(mInstance == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mInstance = </span><span class="s2">new </span><span class="s1">NotesDatabaseHelper(context);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mInstance;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onCreate(SQLiteDatabase db) {</span>
<span class="s1">createNoteTable(db);</span>
<span class="s1">createDataTable(db);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onUpgrade(SQLiteDatabase db, </span><span class="s2">int </span><span class="s1">oldVersion, </span><span class="s2">int </span><span class="s1">newVersion) {</span>
<span class="s2">boolean </span><span class="s1">reCreateTriggers = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">boolean </span><span class="s1">skipV2 = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">1</span><span class="s1">) {</span>
<span class="s1">upgradeToV2(db);</span>
<span class="s1">skipV2 = </span><span class="s2">true</span><span class="s1">; </span><span class="s0">// this upgrade including the upgrade from v2 to v3</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">2 </span><span class="s1">&amp;&amp; !skipV2) {</span>
<span class="s1">upgradeToV3(db);</span>
<span class="s1">reCreateTriggers = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">3</span><span class="s1">) {</span>
<span class="s1">upgradeToV4(db);</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(reCreateTriggers) {</span>
<span class="s1">reCreateNoteTableTriggers(db);</span>
<span class="s1">reCreateDataTableTriggers(db);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion != newVersion) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s3">&quot;Upgrade notes database to version &quot; </span><span class="s1">+ newVersion</span>
<span class="s1">+ </span><span class="s3">&quot;fails&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV2(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TABLE IF EXISTS &quot; </span><span class="s1">+ TABLE.NOTE);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TABLE IF EXISTS &quot; </span><span class="s1">+ TABLE.DATA);</span>
<span class="s1">createNoteTable(db);</span>
<span class="s1">createDataTable(db);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV3(SQLiteDatabase db) {</span>
<span class="s0">// drop unused triggers</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_update&quot;</span><span class="s1">);</span>
<span class="s0">// add a column for gtask id</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;ALTER TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot; ADD COLUMN &quot; </span><span class="s1">+ NoteColumns.GTASK_ID</span>
<span class="s1">+ </span><span class="s3">&quot; TEXT NOT NULL DEFAULT ''&quot;</span><span class="s1">);</span>
<span class="s0">// add a trash system folder</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV4(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;ALTER TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot; ADD COLUMN &quot; </span><span class="s1">+ NoteColumns.VERSION</span>
<span class="s1">+ </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>