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.
software/NotesDatabaseHelper.txt

476 lines
23 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;
/*
* NotesDatabaseHelper 类继承自 SQLiteOpenHelper用于管理 SQLite 数据库的创建和版本升级。
* 该类负责创建和管理两个主要的数据库表NOTE 表和 DATA 表,以及相关的触发器和索引。
*/
public class NotesDatabaseHelper extends SQLiteOpenHelper { // 数据库名称
private static final String DB_NAME = "note.db";
// 数据库版本号
private static final int DB_VERSION = 4;
// 表名常量
public interface TABLE {
public static final String NOTE = "note";
public static final String DATA = "data";
}
// 日志标签
private static final String TAG = "NotesDatabaseHelper";
// 单例实例
private static NotesDatabaseHelper mInstance;
// 创建 NOTE 表的 SQL 语句
/*
* 创建笔记表的 SQL 语句。
* 该表用于存储笔记的相关信息,包括笔记的 ID、父 ID、提醒日期、背景颜色 ID、创建日期、
* 是否有附件、修改日期、笔记数量、摘要、类型、小部件 ID、小部件类型、同步 ID、本地修改标志、
* 原始父 ID、Google 任务 ID 和版本号。
*/
private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," + // 笔记的唯一标识符,主键
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + // 父笔记的 ID默认为 0
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + // 提醒日期,默认为 0
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + // 背景颜色 ID默认为 0
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + // 创建日期,默认为当前时间
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + // 是否有附件,默认为 0
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + // 修改日期,默认为当前时间
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + // 笔记数量,默认为 0
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + // 笔记摘要,默认为空字符串
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + // 笔记类型,默认为 0
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + // 小部件 ID默认为 0
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + // 小部件类型,默认为 -1
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + // 同步 ID默认为 0
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + // 本地修改标志,默认为 0
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + // 原始父 ID默认为 0
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + // Google 任务 ID默认为空字符串
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + // 版本号,默认为 0
")";
// 创建 DATA 表的 SQL 语句
/*
* 创建数据表的 SQL 语句。
* 该表用于存储与笔记相关的数据,包括数据的 ID、MIME 类型、所属笔记的 ID、创建日期、
* 修改日期、内容、以及一些额外的数据字段DATA1 到 DATA5
*/
private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," + // 数据的唯一标识符,主键
DataColumns.MIME_TYPE + " TEXT NOT NULL," + // MIME 类型,不能为空
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + // 所属笔记的 ID默认为 0
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + // 创建日期,默认为当前时间(以毫秒为单位)
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + // 修改日期,默认为当前时间(以毫秒为单位)
DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + // 数据内容,默认为空字符串
DataColumns.DATA1 + " INTEGER," + // 额外数据字段 1整数类型
DataColumns.DATA2 + " INTEGER," + // 额外数据字段 2整数类型
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + // 额外数据字段 3文本类型默认为空字符串
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + // 额外数据字段 4文本类型默认为空字符串
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + // 额外数据字段 5文本类型默认为空字符串
")";
// 创建 DATA 表的 note_id 索引的 SQL 语句
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
// 当笔记移动到文件夹时,增加文件夹的笔记计数触发器
/**
* Increase folder's note count when move note to the folder
*/
/*
* 创建一个触发器,用于在更新笔记的父 ID 时增加父文件夹的笔记数量。
* 该触发器在笔记表的 PARENT_ID 字段更新后触发,并将父文件夹的 NOTES_COUNT 字段加 1。
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_update "+
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
// 当笔记从文件夹中移出时,减少文件夹的笔记计数触发器
/**
* Decrease folder's note count when move note from folder
*/
/*
* 创建一个触发器,用于在更新笔记的父 ID 时减少旧父文件夹的笔记数量。
* 该触发器在笔记表的 PARENT_ID 字段更新后触发,并将旧父文件夹的 NOTES_COUNT 字段减 1。
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_update " +
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
" END";
// 当插入新笔记到文件夹时,增加文件夹的笔记计数触发器
/**
* Increase folder's note count when insert new note to the folder
*/
/*
* 创建一个触发器,用于在插入新笔记时增加父文件夹的笔记数量。
* 该触发器在笔记表插入新记录后触发,并将父文件夹的 NOTES_COUNT 字段加 1。
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_insert " +
" AFTER INSERT ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
// 当从文件夹中删除笔记时,减少文件夹的笔记计数触发器
/**
* Decrease folder's note count when delete note from the folder
*/
/*
* 创建一个触发器,用于在删除笔记时减少父文件夹的笔记数量。
* 该触发器在笔记表删除记录后触发,并将父文件夹的 NOTES_COUNT 字段减 1。
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0;" +
" END";
// 当插入类型为 {@link DataConstants#NOTE} 的数据时,更新笔记内容触发器
/**
* Update note's content when insert data with type {@link DataConstants#NOTE}
*/
/*
* 创建一个触发器,用于在插入新数据时更新笔记的内容摘要。
* 该触发器在数据表插入新记录后触发,并且仅在插入的数据 MIME 类型为 'NOTE' 时执行。
* 触发器会将笔记表中对应笔记的 SNIPPET 字段更新为新插入数据的内容。
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
"CREATE TRIGGER update_note_content_on_insert " +
" AFTER INSERT ON " + TABLE.DATA +
" WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END";
// 当类型为 {@link DataConstants#NOTE} 的数据更新时,更新笔记内容触发器
/**
* Update note's content when data with {@link DataConstants#NOTE} type has changed
*/
/*
* 创建一个触发器,用于在更新数据时更新笔记的内容摘要。
* 该触发器在数据表更新记录后触发,并且仅在更新的数据 MIME 类型为 'NOTE' 时执行。
* 触发器会将笔记表中对应笔记的 SNIPPET 字段更新为更新后的数据内容。
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER update_note_content_on_update " +
" AFTER UPDATE ON " + TABLE.DATA +
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END";
// 当类型为 {@link DataConstants#NOTE} 的数据删除时,更新笔记内容触发器
/**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
*/
/*
*创建一个触发器,用于在删除数据时更新笔记的内容摘要。
* 该触发器在数据表删除记录后触发,并且仅在删除的数据 MIME 类型为 'NOTE' 时执行。
* 触发器会将笔记表中对应笔记的 SNIPPET 字段清空。
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
"CREATE TRIGGER update_note_content_on_delete " +
" AFTER delete ON " + TABLE.DATA +
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=''" +
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
" END";
// 当删除笔记时,删除相关数据触发器
/**
* Delete datas belong to note which has been deleted
*/
/*
* 创建一个触发器,用于在删除笔记时删除与之关联的数据。
* 该触发器在笔记表删除记录后触发,并将数据表中与被删除笔记关联的所有数据删除。
*/
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
"CREATE TRIGGER delete_data_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE +
" BEGIN" +
" DELETE FROM " + TABLE.DATA +
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
" END";
// 当删除文件夹时,删除文件夹中的笔记触发器
/**
* Delete notes belong to folder which has been deleted
*/
/*
*创建一个触发器,用于在删除笔记时删除与之关联的数据。
* 该触发器在笔记表删除记录后触发,并将数据表中与被删除笔记关联的所有数据删除。
*/
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
"CREATE TRIGGER delete_data_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE +
" BEGIN" +
" DELETE FROM " + TABLE.DATA +
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
" END";
// 当文件夹移动到回收站时,移动文件夹中的笔记到回收站触发器
/**
* Move notes belong to folder which has been moved to trash folder
*/
/*
* 创建一个触发器,用于在将文件夹移动到回收站时,将其所有子笔记也移动到回收站。
* 该触发器在笔记表更新记录后触发,并且仅在更新的笔记的 PARENT_ID 字段值为回收站文件夹 ID 时执行。
* 触发器会将所有父 ID 为被更新笔记 ID 的笔记的 PARENT_ID 字段值更新为回收站文件夹 ID。
*/
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
"CREATE TRIGGER folder_move_notes_on_trash " +
" AFTER UPDATE ON " + TABLE.NOTE +
" WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" BEGIN" +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
" END";
/*
* 构造函数,初始化数据库
* 该构造函数用于初始化数据库帮助类,并指定数据库名称和版本号。
* @param context 上下文
*/
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/*
* 创建 NOTE 表
* 创建笔记表及其相关触发器和系统文件夹。
* 该方法用于在数据库中创建笔记表,并调用相关方法创建触发器和系统文件夹。
* @param db SQLiteDatabase 实例
*/
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL); // 执行创建笔记表的 SQL 语句
reCreateNoteTableTriggers(db); // 重新创建笔记表的触发器
createSystemFolder(db); // 创建系统文件夹
Log.d(TAG, "note table has been created"); // 记录日志,表示笔记表已创建
}
/*
* 重新创建 NOTE 表的触发器
* 该方法用于删除现有的笔记表触发器,并重新创建它们,以确保触发器与表结构一致。
* @param db SQLiteDatabase 实例
*/
private void reCreateNoteTableTriggers(SQLiteDatabase db) {
// 删除现有的触发器
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update");
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update");
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");
db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete");
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");
db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete");
db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash");
// 重新创建触发器
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);
db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
}
/*
* 创建系统文件夹
* 该方法用于在数据库中创建系统文件夹,包括通话记录文件夹、根文件夹、临时文件夹和回收站文件夹。
* @param db SQLiteDatabase 实例
*/
private void createSystemFolder(SQLiteDatabase db) {
ContentValues values = new ContentValues();
// 创建通话记录文件夹, 通话记录文件夹,用于存储通话笔记。
/**
* call record foler for call notes
*/
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, 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.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建回收站文件夹
/**
* create trash folder
*/
values.clear();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
}
/*
* 创建 DATA 表
* 该方法用于在数据库中创建数据表,并调用相关方法创建触发器和索引。
* @param db SQLiteDatabase 实例
*/
public void createDataTable(SQLiteDatabase db) {
db.execSQL(CREATE_DATA_TABLE_SQL); // 执行创建数据表的 SQL 语句
reCreateDataTableTriggers(db); // 重新创建数据表的触发器
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); // 创建数据表的索引
Log.d(TAG, "data table has been created"); // 记录日志,表示数据表已创建
}
/*
* 重新创建 DATA 表的触发器
* 该方法用于删除现有的数据表触发器,并重新创建它们,以确保触发器与表结构一致。
* @param db SQLiteDatabase 实例
*/
private void reCreateDataTableTriggers(SQLiteDatabase db) {
// 删除现有的触发器
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update");
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete");
// 重新创建触发器
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
}
/*
* 获取 NotesDatabaseHelper 的单例实例
* 该方法使用 synchronized 关键字确保线程安全,并在实例不存在时创建一个新的实例。
* @param context 上下文
* @return NotesDatabaseHelper 实例
*/
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
}
/*
* 当数据库首次创建时调用此方法
* 该方法在数据库首次创建时被调用,用于创建笔记表和数据表。
* @param db SQLiteDatabase 实例
*/
@Override
public void onCreate(SQLiteDatabase db) {
createNoteTable(db); // 创建笔记表及其相关触发器和系统文件夹
createDataTable(db); // 创建数据表及其相关触发器和索引
}
/*
*当数据库需要升级时调用此方法
*该方法在数据库版本升级时被调用,用于执行相应的升级操作。
* @param db SQLiteDatabase 实例
* @param oldVersion 旧版本号
* @param newVersion 新版本号
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false;
boolean skipV2 = false;
// 如果旧版本是 1执行从版本 1 升级到版本 2 的操作
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // // 这个升级包括从 v2 到 v3 的升级
oldVersion++;
}
// 如果旧版本是 2并且没有跳过 v2 升级,执行从版本 2 升级到版本 3 的操作
if (oldVersion == 2 && !skipV2) {
upgradeToV3(db);
reCreateTriggers = true;
oldVersion++;
}
// 如果旧版本是 3执行从版本 3 升级到版本 4 的操作
if (oldVersion == 3) {
upgradeToV4(db);
oldVersion++;
}
// 如果需要重新创建触发器,重新创建笔记表和数据表的触发器
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
reCreateDataTableTriggers(db);
}
// 如果升级失败,抛出异常
if (oldVersion != newVersion) {
throw new IllegalStateException("Upgrade notes database to version " + newVersion
+ "fails");
}
}
/*
* 升级数据库到版本 2
* 该方法用于删除现有的笔记表和数据表,并重新创建它们。
* @param db SQLiteDatabase 实例
*/
private void upgradeToV2(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); // 删除现有的笔记表
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); // 删除现有的数据表
createNoteTable(db); // 重新创建笔记表及其相关触发器和系统文件夹
createDataTable(db); // 重新创建数据表及其相关触发器和索引
}
/*
* 升级数据库到版本 3
* @param db SQLiteDatabase 实例
*/
private void upgradeToV3(SQLiteDatabase db) {
// drop unused triggers
// 删除不再使用的触发器
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete");
db.execSQL("DROP TRIGGER IF EXISTS 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 ''");
// add a trash system folder
// 添加回收站系统文件夹
ContentValues values = new ContentValues();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
}
/*
*升级数据库到版本 4
* @param db SQLiteDatabase 实例
*/
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
}