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.
2Q1/NotesDatabaseHelper.java

381 lines
34 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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.data;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
public class NotesDatabaseHelper extends SQLiteOpenHelper // 定义一个名为 NotesDatabaseHelper 的公共类,它继承自 SQLiteOpenHelper。{
private static final String DB_NAME = "note.db";// 定义一个私有静态常量字符串 DB_NAME其值为“note.db”表示数据库名称。
private static final int DB_VERSION = 4;// 定义一个私有静态常量整数 DB_VERSION其值为 4表示数据库版本号。
public interface TABLE {// 定义一个公共接口 TABLE。
public static final String NOTE = "note";// 定义一个公共静态常量字符串 NOTE其值为“note”。
public static final String DATA = "data";// 定义一个公共静态常量字符串 DATA其值为“data”。
}
private static final String TAG = "NotesDatabaseHelper";// 定义一个私有静态常量字符串 TAG其值为“NotesDatabaseHelper”。
private static NotesDatabaseHelper mInstance;// 定义一个私有静态变量 mInstance类型为 NotesDatabaseHelper。
private static final String CREATE_NOTE_TABLE_SQL =// 定义一个私有静态常量字符串
"CREATE TABLE " + TABLE.NOTE + "(" +// “创建表”+接口 TABLE 中的常量 NOTE+“(”。
NoteColumns.ID + " INTEGER PRIMARY KEY," +// NoteColumns 中的常量 ID+“整数类型,为主键”+逗号分隔符。
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 PARENT_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 ALERTED_DATE+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 BG_COLOR_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +// NoteColumns 中的常量 CREATED_DATE+“整数类型,不能为空,默认值为(通过 strftime 函数获取当前时间的秒数并乘以 1000”+逗号分隔符。
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 HAS_ATTACHMENT+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +// NoteColumns 中的常量 MODIFIED_DATE+“整数类型,不能为空,默认值为(通过 strftime 函数获取当前时间的秒数并乘以 1000”+逗号分隔符。
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 NOTES_COUNT+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +// NoteColumns 中的常量 SNIPPET+“文本类型,不能为空,默认值为空字符串”+逗号分隔符。
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 TYPE+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 WIDGET_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +// NoteColumns 中的常量 WIDGET_TYPE+“整数类型,不能为空,默认值为 -1”+逗号分隔符。
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 SYNC_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 LOCAL_MODIFIED+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +// NoteColumns 中的常量 ORIGIN_PARENT_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +// NoteColumns 中的常量 GTASK_ID+“文本类型,不能为空,默认值为空字符串”+逗号分隔符。
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +// NoteColumns 中的常量 VERSION+“整数类型,不能为空,默认值为 0”。
")";
private static final String CREATE_DATA_TABLE_SQL =// 定义一个私有静态常量字符串 CREATE_DATA_TABLE_SQL。
"CREATE TABLE " + TABLE.DATA + "(" +// “创建表”+接口 TABLE 中的常量 DATA+“(”。
DataColumns.ID + " INTEGER PRIMARY KEY," +// DataColumns 中的常量 ID+“整数类型,为主键”+逗号分隔符。
DataColumns.MIME_TYPE + " TEXT NOT NULL," +// DataColumns 中的常量 MIME_TYPE+“文本类型,不能为空”+逗号分隔符。
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +// DataColumns 中的常量 NOTE_ID+“整数类型,不能为空,默认值为 0”+逗号分隔符。
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +// NoteColumns 中的常量 CREATED_DATE+“整数类型,不能为空,默认值为(通过 strftime 函数获取当前时间的秒数并乘以 1000”+逗号分隔符。
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +// NoteColumns 中的常量 MODIFIED_DATE+“整数类型,不能为空,默认值为(通过 strftime 函数获取当前时间的秒数并乘以 1000”+逗号分隔符。
DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +// DataColumns 中的常量 CONTENT+“文本类型,不能为空,默认值为空字符串”+逗号分隔符。
DataColumns.DATA1 + " INTEGER," +// DataColumns 中的常量 DATA1+“整数类型”+逗号分隔符。
DataColumns.DATA2 + " INTEGER," +// DataColumns 中的常量 DATA2+“整数类型”+逗号分隔符。
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +// DataColumns 中的常量 DATA3+“文本类型,不能为空,默认值为空字符串”+逗号分隔符。
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +// DataColumns 中的常量 DATA4+“文本类型,不能为空,默认值为空字符串”+逗号分隔符。
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +// DataColumns 中的常量 DATA5+“文本类型,不能为空,默认值为空字符串”。
")";
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =// 定义一个私有静态常量字符串 CREATE_DATA_NOTE_ID_INDEX_SQL。
"CREATE INDEX IF NOT EXISTS note_id_index ON " +// “创建索引,如果索引不存在,索引名为 note_id_index在”+。
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";// 接口 TABLE 中的常量 DATA+“(”+DataColumns 中的常量 NOTE_ID+“)”,即基于数据表中的 NOTE_ID 字段创建索引。
/**
* Increase folder's note count when move note to the folder
*/
// 这是一段注释,意思是“当将笔记移动到文件夹时,增加文件夹的笔记计数”。
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =// 定义一个私有静态常量字符串 NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER。
"CREATE TRIGGER increase_folder_count_on_update "+// “创建触发器,触发器名为 increase_folder_count_on_update”+空格分隔符。
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +// “在更新 Note 表中的 PARENT_ID 字段之后”+空格分隔符+NoteColumns 中的常量 PARENT_ID+“在”+接口 TABLE 中的常量 NOTE。
" BEGIN " +// “开始”。
" UPDATE " + TABLE.NOTE +
// “更新”+接口 TABLE 中的常量 NOTE。
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +// “设置”+NoteColumns 中的常量 NOTES_COUNT+“等于”+NoteColumns 中的常量 NOTES_COUNT+“加 1”。
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +// “条件是”+NoteColumns 中的常量 ID+“等于 new.”+NoteColumn.PARENT_ID其中 new 表示新值。
" END";// “结束”。
/**
* Decrease folder's note count when move note from folder
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =// 定义一个私有静态常量字符串 NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER。
"CREATE TRIGGER decrease_folder_count_on_update " +// “创建触发器,触发器名为 decrease_folder_count_on_update”+空格分隔符。
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +// “在更新 Note 表中的 PARENT_ID 字段之后”+空格分隔符+NoteColumns 中的常量 PARENT_ID+“在”+接口 TABLE 中的常量 NOTE。
" BEGIN " +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +// “设置”+NoteColumns 中的常量 NOTES_COUNT+“等于”+NoteColumns 中的常量 NOTES_COUNT+“减 1”。
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +// “条件是”+NoteColumns 中的常量 ID+“等于 old.”+NoteColumns 中的常量 PARENT_ID其中 old 表示旧值。
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +// “并且”+NoteColumns 中的常量 NOTES_COUNT+“大于 0”+分号分隔符。
" END";// “结束”。
/**
* Increase folder's note count when insert new note to the folder
*/
// 这是一段注释,意思是“当向文件夹中插入新笔记时,增加文件夹的笔记计数”。
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =// 定义一个私有静态常量字符串 NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER。
"CREATE TRIGGER increase_folder_count_on_insert " +// “创建触发器,触发器名为 increase_folder_count_on_insert”+空格分隔符。
" AFTER INSERT ON " + TABLE.NOTE +// “在向 Note 表插入数据之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" BEGIN " +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +// “设置”+NoteColumns 中的常量 NOTES_COUNT+“等于”+NoteColumns 中的常量 NOTES_COUNT+“加 1”。
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +// “条件是”+NoteColumns 中的常量 ID+“等于 new.”+NoteColumns 中的常量 PARENT_ID其中 new 表示新值。
" END";// “结束”。
/**
* Decrease folder's note count when delete note from the folder
*/
// 这是一段注释,意思是“当从文件夹中删除笔记时,减少文件夹的笔记计数”。
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =// 定义一个私有静态常量字符串 NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER。
"CREATE TRIGGER decrease_folder_count_on_delete " +// “创建触发器,触发器名为 decrease_folder_count_on_delete”+空格分隔符。
" AFTER DELETE ON " + TABLE.NOTE +// “在从 Note 表删除数据之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" BEGIN " +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +// “设置”+NoteColumns 中的常量 NOTES_COUNT+“等于”+NoteColumns 中的常量 NOTES_COUNT+“减 1”。
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +// “条件是”+NoteColumns 中的常量 ID+“等于 old.”+NoteColumns 中的常量 PARENT_ID其中 old 表示旧值。
" AND " + NoteColumns.NOTES_COUNT + ">0;" +// “并且”+NoteColumns 中的常量 NOTES_COUNT+“大于 0”+分号分隔符。
" END";// “结束”。
/**
* Update note's content when insert data with type {@link DataConstants#NOTE}
*/
// 这是一段注释,意思是“当插入类型为{@link DataConstants#NOTE}的数据时,更新笔记的内容”。
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =// 定义一个私有静态常量字符串 DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER。
"CREATE TRIGGER update_note_content_on_insert " +// “创建触发器,触发器名为 update_note_content_on_insert”+空格分隔符。
" AFTER INSERT ON " + TABLE.DATA +// “在向 Data 表插入数据之后”+空格分隔符+接口 TABLE 中的常量 DATA。
" WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +// “当新插入的数据中DataColumns 中的常量 MIME_TYPE 等于DataConstants.NOTE时”+空格分隔符。
" BEGIN" +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +// “设置”+NoteColumns 中的常量 SNIPPET+“等于新插入数据中的”+DataColumns 中的常量 CONTENT。
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +// “条件是”+NoteColumns 中的常量 ID+“等于新插入数据中的”+DataColumns 中的常量 NOTE_ID+分号分隔符。
" END";// “结束”。
/**
* Update note's content when data with {@link DataConstants#NOTE} type has changed
*/
// 这是一段注释,意思是“当类型为{@link DataConstants#NOTE}的数据发生变化时,更新笔记的内容”。
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =// 定义一个私有静态常量字符串 DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER。
"CREATE TRIGGER update_note_content_on_update " +// “创建触发器,触发器名为 update_note_content_on_update”+空格分隔符。
" AFTER UPDATE ON " + TABLE.DATA +// “在更新 Data 表之后”+空格分隔符+接口 TABLE 中的常量 DATA。
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +// “当旧数据中DataColumns 中的常量 MIME_TYPE 等于DataConstants.NOTE时”+空格分隔符。
" BEGIN" +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +// “设置”+NoteColumns 中的常量 SNIPPET+“等于新数据中的”+DataColumns 中的常量 CONTENT。
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +// “条件是”+NoteColumns 中的常量 ID+“等于新数据中的”+DataColumns 中的常量 NOTE_ID+分号分隔符。
" END";// “结束”。
/**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
*/
// 这是一段注释,意思是“当类型为{@link DataConstants#NOTE}的数据被删除时,更新笔记的内容”。
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =// 定义一个私有静态常量字符串 DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER。
"CREATE TRIGGER update_note_content_on_delete " +// “创建触发器,触发器名为 update_note_content_on_delete”+空格分隔符。
" AFTER delete ON " + TABLE.DATA +// “在删除 Data 表中的数据之后”+空格分隔符+接口 TABLE 中的常量 DATA。
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +// “当旧数据中DataColumns 中的常量 MIME_TYPE 等于DataConstants.NOTE时”+空格分隔符。
" BEGIN" +// “开始”。
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.SNIPPET + "=''" +// “设置”+NoteColumns 中的常量 SNIPPET 为空字符串。
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +// “条件是”+NoteColumns 中的常量 ID+“等于旧数据中的”+DataColumns 中的常量 NOTE_ID+分号分隔符。
" END";// “结束”。
/**
* Delete datas belong to note which has been deleted
*/
// 这是一段注释,意思是“删除已被删除的笔记所对应的所有数据”。
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =// 定义一个私有静态常量字符串 NOTE_DELETE_DATA_ON_DELETE_TRIGGER。
"CREATE TRIGGER delete_data_on_delete " +// “创建触发器,触发器名为 delete_data_on_delete”+空格分隔符。
" AFTER DELETE ON " + TABLE.NOTE +// “在删除 Note 表中的数据之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" BEGIN" +// “开始”。
" DELETE FROM " + TABLE.DATA +// “从”+接口 TABLE 中的常量 DATA 表中删除数据。
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +// “条件是”+DataColumns 中的常量 NOTE_ID+“等于旧数据中的”+NoteColumns 中的常量 ID+分号分隔符。
" END";// “结束”。
/**
* Delete notes belong to folder which has been deleted
*/
// 这是一段注释,意思是“删除已被删除的文件夹所对应的所有笔记”。
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =// 定义一个私有静态常量字符串 FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER。
"CREATE TRIGGER folder_delete_notes_on_delete " +// “创建触发器,触发器名为 folder_delete_notes_on_delete”+空格分隔符。
" AFTER DELETE ON " + TABLE.NOTE +// “在删除 Note 表中的数据之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" BEGIN" +// “开始”。
" DELETE FROM " + TABLE.NOTE +// “从”+接口 TABLE 中的常量 NOTE 表中删除数据。
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +// “条件是”+NoteColumns 中的常量 PARENT_ID+“等于旧数据中的”+NoteColumns 中的常量 ID+分号分隔符。
" END";// “结束”。
/**
* Move notes belong to folder which has been moved to trash folder
*/
// 这是一段注释,意思是“将已被移动到回收站文件夹的文件夹所对应的笔记移动到回收站”。
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =// 定义一个私有静态常量字符串 FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER。
"CREATE TRIGGER folder_move_notes_on_trash " +// “创建触发器,触发器名为 folder_move_notes_on_trash”+空格分隔符。
" AFTER UPDATE ON " + TABLE.NOTE +// “在更新 Note 表之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +// “在更新 Note 表之后”+空格分隔符+接口 TABLE 中的常量 NOTE。
" BEGIN" +
" UPDATE " + TABLE.NOTE +// “更新”+接口 TABLE 中的常量 NOTE。
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +// “设置”+NoteColumns 中的常量 PARENT_ID 等于 Notes.ID_TRASH_FOLER。
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +// “条件是”+NoteColumns 中的常量 PARENT_ID+“等于旧数据中的”+NoteColumns 中的常量 ID+分号分隔符。
" END";// “结束”。
public NotesDatabaseHelper(Context context) {// 定义一个公共的构造函数 NotesDatabaseHelper接收一个 Context 参数。
super(context, DB_NAME, null, DB_VERSION);// 调用父类 SQLiteOpenHelper 的构造函数,传入 Context、数据库名、游标工厂这里为 null和数据库版本号。
}
public void createNoteTable(SQLiteDatabase db) {// 定义一个公共方法 createNoteTable接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL(CREATE_NOTE_TABLE_SQL);// 执行 SQL 语句 CREATE_NOTE_TABLE_SQL用于创建 note 表。
reCreateNoteTableTriggers(db);// 调用私有方法 reCreateNoteTableTriggers传入参数 db用于重新创建 note 表的触发器。
createSystemFolder(db);// 调用 createSystemFolder 方法,传入参数 db可能用于创建系统文件夹。
Log.d(TAG, "note table has been created");// 使用日志记录工具打印信息,表明 note 表已被创建TAG 是一个常量,用于标识日志来源。
}
private void reCreateNoteTableTriggers(SQLiteDatabase db) {// 定义一个私有方法 reCreateNoteTableTriggers接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update");// 执行 SQL 语句,如果存在名为 increase_folder_count_on_update 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update");// 执行 SQL 语句,如果存在名为 decrease_folder_count_on_update 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");// 执行 SQL 语句,如果存在名为 decrease_folder_count_on_delete 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete");// 执行 SQL 语句,如果存在名为 delete_data_on_delete 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");// 执行 SQL 语句,如果存在名为 increase_folder_count_on_insert 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete");// 执行 SQL 语句,如果存在名为 folder_delete_notes_on_delete 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash");// 执行 SQL 语句,如果存在名为 folder_move_notes_on_trash 的触发器,则删除它。
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);// 执行 SQL 语句,创建名为 NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER 的触发器。
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);// 执行 SQL 语句,创建名为 NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER 的触发器。
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);// 执行 SQL 语句,创建名为 NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER 的触发器。
db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);// 执行 SQL 语句,创建名为 NOTE_DELETE_DATA_ON_DELETE_TRIGGER 的触发器。
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);// 执行 SQL 语句,创建名为 NOTE_DELETE_DATA_ON_DELETE_TRIGGER 的触发器。
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);// 执行 SQL 语句,创建名为 FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER 的触发器。
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);// 执行 SQL 语句,创建名为 FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER 的触发器。
}
private void createSystemFolder(SQLiteDatabase db) {// 定义一个私有方法 createSystemFolder接收一个 SQLiteDatabase 类型的参数 db。
ContentValues values = new ContentValues();// 创建一个 ContentValues 对象 values。
/**
* call record foler for call notes
*/
// 这是一段注释,意思是“用于通话记录笔记的通话记录文件夹”。
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);// 将 Notes 类中的常量 ID_CALL_RECORD_FOLDER 放入 values 的键为 NoteColumns.ID 的位置。
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);// 将 Notes 类中的常量 TYPE_SYSTEM 放入 values 的键为 NoteColumns.TYPE 的位置。
db.insert(TABLE.NOTE, null, values);// 向表 TABLE.NOTE 插入数据,第三个参数为 values。
/**
* root folder which is default folder
*/
// 这是一段注释,意思是“根文件夹,它是默认文件夹”。
values.clear();
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
/**
* temporary folder which is used for moving note
*/
values.clear();// 清空 values。
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);// 将 Notes 类中的常量 ID_ROOT_FOLDER 放入 values 的键为 NoteColumns.ID 的位置。
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);// 将 Notes 类中的常量 TYPE_SYSTEM 放入 values 的键为 NoteColumns.TYPE 的位置。
db.insert(TABLE.NOTE, null, values);// 向表 TABLE.NOTE 插入数据,第三个参数为 values。
/**
* create trash folder
*/
// 这是一段注释,意思是“临时文件夹,用于移动笔记”。
values.clear();// 清空 values。
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);// 将 Notes 类中的常量 ID_TEMPARAY_FOLDER 放入 values 的键为 NoteColumns.ID 的位置。
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);// 将 Notes 类中的常量 TYPE_SYSTEM 放入 values 的键为 NoteColumns.TYPE 的位置。
db.insert(TABLE.NOTE, null, values);// 向表 TABLE.NOTE 插入数据,第三个参数为 values。
}
public void createDataTable(SQLiteDatabase db) {// 定义一个公共方法 createDataTable接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL(CREATE_DATA_TABLE_SQL);// 执行 SQL 语句 CREATE_DATA_TABLE_SQL用于创建 data 表。
reCreateDataTableTriggers(db);// 调用私有方法 reCreateDataTableTriggers传入参数 db用于重新创建 data 表的触发器。
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);// 执行 SQL 语句 CREATE_DATA_NOTE_ID_INDEX_SQL用于创建 data 表的索引。
Log.d(TAG, "data table has been created");// 使用日志记录工具打印信息,表明 data 表已被创建TAG 是一个常量,用于标识日志来源。
}
private void reCreateDataTableTriggers(SQLiteDatabase db) {// 定义一个私有方法 reCreateDataTableTriggers接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");// 执行 SQL 语句,如果存在名为 update_note_content_on_insert 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update");// 执行 SQL 语句,如果存在名为 update_note_content_on_update 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete");// 执行 SQL 语句,如果存在名为 update_note_content_on_delete 的触发器,则删除它。
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);// 执行 SQL 语句,创建名为 DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER 的触发器。
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);// 执行 SQL 语句,创建名为 DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER 的触发器。
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);// 执行 SQL 语句,创建名为 DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER 的触发器。
}
static synchronized NotesDatabaseHelper getInstance(Context context) {// 定义一个静态同步方法 getInstance接收一个 Context 类型的参数 context。
if (mInstance == null) {// 如果 mInstance 为 null。
mInstance = new NotesDatabaseHelper(context);// 创建一个新的 NotesDatabaseHelper 实例,传入 context 参数,并赋值给 mInstance。
}
return mInstance;// 返回 mInstance。
}
@Override
public void onCreate(SQLiteDatabase db) {// 重写 onCreate 方法,接收一个 SQLiteDatabase 类型的参数 db。
createNoteTable(db);// 调用 createNoteTable 方法,传入参数 db创建 note 表。
createDataTable(db);// 调用 createDataTable 方法,传入参数 db创建 data 表。
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 重写 onUpgrade 方法,接收一个 SQLiteDatabase 类型的参数 db以及旧版本号 oldVersion 和新版本号 newVersion。
boolean reCreateTriggers = false;false;
// 定义一个布尔变量 reCreateTriggers初始值为 false。
boolean skipV2 = false;// 定义一个布尔变量 skipV2初始值为 false。
if (oldVersion == 1) {// 如果旧版本号为 1。
upgradeToV2(db);// 调用 upgradeToV2 方法,传入参数 db进行从版本 1 到版本 2 的升级。
skipV2 = true; // this upgrade including the upgrade from v2 to v3
// 将 skipV2 设置为 true表示此次升级包括从版本 2 到版本 3 的升级。
oldVersion++;// 旧版本号加 1。
}
if (oldVersion == 2 && !skipV2) {// 如果旧版本号为 2 且 skipV2 为 false。
upgradeToV3(db);// 调用 upgradeToV3 方法,传入参数 db进行从版本 2 到版本 3 的升级。
reCreateTriggers = true;// 将 reCreateTriggers 设置为 true表示需要重新创建触发器。
oldVersion++;// 旧版本号加 1。
}
if (oldVersion == 3) {// 如果旧版本号为 3。
upgradeToV4(db);// 调用 upgradeToV4 方法,传入参数 db进行从版本 3 到版本 4 的升级。
oldVersion++;// 旧版本号加 1。
}
if (reCreateTriggers) {// 如果 reCreateTriggers 为 true。
reCreateNoteTableTriggers(db);// 调用 reCreateNoteTableTriggers 方法,传入参数 db重新创建 note 表的触发器。
reCreateDataTableTriggers(db);// 调用 reCreateDataTableTriggers 方法,传入参数 db重新创建 data 表的触发器。
}
if (oldVersion != newVersion) {// 如果旧版本号不等于新版本号。
throw new IllegalStateException("Upgrade notes database to version " + newVersion
+ "fails");// 抛出一个 IllegalStateException 异常,表明升级笔记数据库到新版本失败。
}
}
private void upgradeToV2(SQLiteDatabase db) {// 定义一个私有方法 upgradeToV2接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);// 执行 SQL 语句,如果存在表 TABLE.NOTE则删除它。
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);// 执行 SQL 语句,如果存在表 TABLE.DATA则删除它。
createNoteTable(db);// 调用 createNoteTable 方法,传入参数 db创建 note 表。
createDataTable(db);// 调用 createDataTable 方法,传入参数 db创建 data 表。
}
private void upgradeToV3(SQLiteDatabase db) {// 定义一个私有方法 upgradeToV3接收一个 SQLiteDatabase 类型的参数 db。
// drop unused triggers
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");// 执行 SQL 语句,如果存在名为 update_note_modified_date_on_insert 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete");// 执行 SQL 语句,如果存在名为 update_note_modified_date_on_insert 的触发器,则删除它。
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update");// 执行 SQL 语句,如果存在名为 update_note_modified_date_on_update 的触发器,则删除它。
// add a column for gtask id
// 注释:添加一个用于 gtask id 的列。
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
+ " TEXT NOT NULL DEFAULT ''");// 执行 SQL 语句,在表 TABLE.NOTE 中添加一个名为 NoteColumns.GTASK_ID 的列,类型为文本,默认值为空字符串。
// add a trash system folder
// 注释:添加一个回收站系统文件夹。
ContentValues values = new ContentValues();// 创建一个 ContentValues 对象 values。
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);// 将 Notes 类中的常量 ID_TRASH_FOLER 放入 values 的键为 NoteColumns.ID 的位置。
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);// 将 Notes 类中的常量 TYPE_SYSTEM 放入 values 的键为 NoteColumns.TYPE 的位置。
db.insert(TABLE.NOTE, null, values);// 向表 TABLE.NOTE 插入数据,第三个参数为 values。
}
private void upgradeToV4(SQLiteDatabase db) {// 定义一个私有方法 upgradeToV4接收一个 SQLiteDatabase 类型的参数 db。
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");// 执行 SQL 语句,在表 TABLE.NOTE 中添加一个名为 NoteColumns.VERSION 的列,类型为整数,默认值为 0。
}
}