ADD file via upload

wxk_branch
pkw2ie96j 1 year ago
parent a84b13ce12
commit b7a77d3265

@ -0,0 +1,540 @@
/*
* 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`
*
*/
public class NotesDatabaseHelper extends SQLiteOpenHelper {
// 定义数据库的名称这里是“note.db”表示应用中存储笔记数据的数据库文件名
private static final String DB_NAME = "note.db";
// 定义数据库的版本号用于数据库升级等操作的版本控制这里初始版本号为4每次数据库结构有变更时可能会相应更新该版本号
private static final int DB_VERSION = 4;
/**
* `TABLE`便
*/
public interface TABLE {
// 定义笔记表的名称常量,用于在创建表、查询等操作中明确操作的是哪个表
public static final String NOTE = "note";
// 定义数据(可能是笔记附属的数据,如附件等相关数据)表的名称常量,同样用于相关数据库操作中对该表的引用
public static final String DATA = "data";
}
// 用于在日志输出中标识当前类的简单名称,方便在查看日志时快速定位到该类相关的操作记录,便于调试和问题排查
private static final String TAG = "NotesDatabaseHelper";
// 单例模式下的唯一实例对象,通过静态方法`getInstance`来获取该实例,保证整个应用只有一个该类实例来管理数据库操作,避免多次创建造成资源浪费或数据不一致等问题
private static NotesDatabaseHelper mInstance;
// 创建笔记表(`TABLE.NOTE`的SQL语句定义了表的各个列名、数据类型以及一些列的默认值等信息用于构建笔记表的结构
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," +
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
")";
// 创建数据(`TABLE.DATA`表的SQL语句规定了该表包含的列名、数据类型以及默认值等用于存储与笔记相关的数据信息比如可能是附件数据等
private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," +
DataColumns.MIME_TYPE + " TEXT NOT NULL," +
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 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," +
DataColumns.DATA2 + " INTEGER," +
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
")";
// 创建数据(`TABLE.DATA`)表中基于`NOTE_ID`字段的索引的SQL语句通过创建索引可以提高根据笔记ID查询相关数据的效率
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
*/
/**
* SQL`NoteColumns.PARENT_ID`
* `TABLE.NOTE``NoteColumns.PARENT_ID``NoteColumns.NOTES_COUNT`
*/
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
*/
/**
* SQL`NoteColumns.PARENT_ID`
* `TABLE.NOTE``NoteColumns.PARENT_ID`0`NoteColumns.NOTES_COUNT`
*/
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
*/
/**
* SQL`TABLE.NOTE`
* `NoteColumns.NOTES_COUNT``Parent_ID`
*/
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
*/
/**
* SQL`TABLE.NOTE`
* `NoteColumns.NOTES_COUNT``Parent_ID`0
*/
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";
/**
* Update note's content when insert data with type {@link DataConstants#NOTE}
*/
/**
* SQL`TABLE.DATA``DataConstants.NOTE`
* `TABLE.NOTE``NoteColumns.SNIPPET``CONTENT``NOTE_ID`
*/
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";
/**
* Update note's content when data with {@link DataConstants#NOTE} type has changed
*/
/**
* SQL`TABLE.DATA``DataConstants.NOTE`
* `TABLE.NOTE``NoteColumns.SNIPPET``CONTENT``NOTE_ID`
*/
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";
/**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
*/
/**
* SQL`TABLE.DATA``DataConstants.NOTE`
* `TABLE.NOTE``NoteColumns.SNIPPET``NOTE_ID`
*/
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
*/
/**
* SQL`TABLE.NOTE``TABLE.DATA`
* `DataColumns.NOTE_ID``NoteColumns.ID`
*/
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
*/
/**
* SQL`TABLE.NOTE``TABLE.NOTE`
* `NoteColumns.PARENT_ID``NoteColumns.ID`
*/
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
"CREATE TRIGGER folder_delete_notes_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE +
" BEGIN" +
" DELETE FROM " + TABLE.NOTE +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
" END";
/**
* Move notes belong to folder which has been moved to trash folder
*/
/**
* SQL`TABLE.NOTE``NoteColumns.PARENT_ID`
* `NoteColumns.PARENT_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";
/**
* `SQLiteOpenHelper``null`
*
* @param context
*/
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* `TABLE.NOTE``SQLiteDatabase`SQL
* `reCreateNoteTableTriggers`
* `createSystemFolder`
*
* @param db `SQLiteDatabase``getWritableDatabase``getReadableDatabase`
*/
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL);
reCreateNoteTableTriggers(db);
createSystemFolder(db);
Log.d(TAG, "note table has been created");
}
/**
* `TABLE.NOTE`
* 使`DROP TRIGGER IF EXISTS`
*
*
* @param db `SQLiteDatabase`SQL
*/
private void reCreateNoteTableTriggers(SQLiteDatabase db) {
// 删除名为“increase_folder_count_on_update”的触发器如果存在的话该触发器用于在笔记移动到文件夹时增加文件夹的笔记数量
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update");
// 删除名为“decrease_folder_count_on_update”的触发器若存在此触发器在笔记从文件夹移出时减少文件夹的笔记数量
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update");
// 删除“decrease_folder_count_on_delete”触发器如果有用于在从文件夹删除笔记时减少文件夹笔记数量
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");
// 删除“delete_data_on_delete”触发器若存在其作用是当笔记被删除时删除与之关联的数据表中的相关数据
db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete");
// 删除“increase_folder_count_on_insert”触发器如果存在该触发器在向文件夹插入新笔记时增加文件夹笔记数量
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");
// 删除“folder_delete_notes_on_delete”触发器若存在用于在文件夹被删除时删除该文件夹下的所有笔记
db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete");
// 删除“folder_move_notes_on_trash”触发器如果有此触发器在文件夹被移动到回收站时将该文件夹下的笔记也移动到回收站
db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash");
// 重新创建“increase_folder_count_on_update”触发器用于实现笔记移动到文件夹时文件夹笔记数量的增加逻辑
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
// 重新创建“decrease_folder_count_on_update”触发器以处理笔记从文件夹移出时文件夹笔记数量减少的情况
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
// 重新创建“decrease_folder_count_on_delete”触发器用于在从文件夹删除笔记时正确减少文件夹的笔记数量
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);
// 重新创建“delete_data_on_delete”触发器确保在笔记被删除时能正确删除与之关联的数据
db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);
// 重新创建“increase_folder_count_on_insert”触发器实现向文件夹插入新笔记时增加文件夹笔记数量的功能
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
// 重新创建“folder_delete_notes_on_delete”触发器使得文件夹被删除时能相应删除其下的所有笔
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
// 重新创建“folder_move_notes_on_trash”触发器保证文件夹移动到回收站时其下笔记也能正确移动到回收站
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
}
/**
*
* `TABLE.NOTE`使`ContentValues`
* `db.insert`
*
* @param db `SQLiteDatabase`
*/
private void createSystemFolder(SQLiteDatabase db) {
// 创建一个用于存储表列值的ContentValues对象用于后续设置要插入的文件夹记录的各列数据
ContentValues values = new ContentValues();
/**
* call record foler for call notes
*/
/**
* `TABLE.NOTE`
* ID`Notes.ID_CALL_RECORD_FOLDER``Notes.ID_CALL_RECORD_FOLDER`
* `Notes.TYPE_SYSTEM`
*/
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
*/
/**
* ID`Notes.ID_ROOT_FOLDER`
* `Notes.TYPE_SYSTEM`
*/
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
*/
/**
* ID`Notes.ID_TEMPARAY_FOLDER`
* `Notes.TYPE_SYSTEM`
*/
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
*/
/**
* ID`Notes.ID_TRASH_FOLER`
* `Notes.TYPE_SYSTEM`
*/
values.clear();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
}
/**
* `TABLE.DATA``SQLiteDatabase`SQL
* `reCreateDataTableTriggers``NOTE_ID`SQL
* 便
*
* @param db `SQLiteDatabase`
*/
public void createDataTable(SQLiteDatabase db) {
db.execSQL(CREATE_DATA_TABLE_SQL);
reCreateDataTableTriggers(db);
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
Log.d(TAG, "data table has been created");
}
/**
* `TABLE.DATA`
* 使`DROP TRIGGER IF EXISTS`
*
*
* @param db `SQLiteDatabase`SQL
*/
private void reCreateDataTableTriggers(SQLiteDatabase db) {
// 删除名为“update_note_content_on_insert”的触发器如果存在的话该触发器用于在向数据表格插入特定类型数据时更新关联笔记的内容
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
// 删除“update_note_content_on_update”触发器若存在此触发器在数据表格中的数据更新时相应更新关联笔记的内容
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update");
// 删除“update_note_content_on_delete”触发器如果有用于在数据表格中的数据被删除时对关联笔记内容进行相应处理
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete");
// 重新创建“update_note_content_on_insert”触发器以实现向数据表格插入特定类型数据时更新关联笔记内容的功能
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
// 重新创建“update_note_content_on_insert”触发器以实现向数据表格插入特定类型数据时更新关联笔记内容的功能
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
// 重新创建“update_note_content_on_delete”触发器使得在数据表格中的数据被删除时能按逻辑处理关联笔记的内容
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
}
/**
* `NotesDatabaseHelper`
*
* `mInstance``null``NotesDatabaseHelper`使
*
* @param context `NotesDatabaseHelper`访
* @return `NotesDatabaseHelper`
*/
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
}
/**
* `SQLiteOpenHelper`
* `createNoteTable``createDataTable`
* 使
*
* @param db `SQLiteDatabase`SQL
*/
@Override
public void onCreate(SQLiteDatabase db) {
createNoteTable(db);
createDataTable(db);
}
/**
* `SQLiteOpenHelper`
* `oldVersion`134`NoteColumns.VERSION`
* `reCreateTriggers``newVersion`
*
*
* @param db `SQLiteDatabase`SQL
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false;
boolean skipV2 = false;
// 如果数据库的旧版本号为1表示是从版本1进行升级执行`upgradeToV2`方法进行升级操作,同时标记`skipV2`为`true`
// 意味着这次升级包含了从版本2到版本3的升级逻辑可能后续有相关判断依赖此标记然后将旧版本号加1表示已经处理了版本1的升级情况。
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // this upgrade including the upgrade from v2 to v3
oldVersion++;
}
// 如果旧版本号为2且`skipV2`为`false`即不是从版本1直接升级过来包含了后续版本升级逻辑的情况则执行`upgradeToV3`方法进行版本3的升级操作
// 并将`reCreateTriggers`标记为`true`表示需要重新创建相关触发器之后将旧版本号再加1。
if (oldVersion == 2 && !skipV2) {
upgradeToV3(db);
reCreateTriggers = true;
oldVersion++;
}
// 如果旧版本号为3则执行`upgradeToV4`方法将数据库升级到版本4然后将旧版本号加1
if (oldVersion == 3) {
upgradeToV4(db);
oldVersion++;
}
// 如果`reCreateTriggers`为`true`,即需要重新创建触发器的情况,分别调用`reCreateNoteTableTriggers`和`reCreateDataTableTriggers`方法
// 来重新创建笔记表和数据表相关的触发器,确保数据库升级后触发器的配置符合新的业务逻辑要求。
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
reCreateDataTableTriggers(db);
}
// 最后检查升级后的数据库版本号是否与期望的新版本号一致,如果不一致则抛出`IllegalStateException`异常,提示数据库升级失败,
// 并给出期望升级到的版本号信息,方便排查升级过程中出现的问题。
if (oldVersion != newVersion) {
throw new IllegalStateException("Upgrade notes database to version " + newVersion
+ "fails");
}
}
/**
* 12
* `TABLE.NOTE``TABLE.DATA`使`DROP TABLE IF EXISTS`
* `createNoteTable``createDataTable`12
*
* @param db `SQLiteDatabase`SQL
*/
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);
}
/**
* 23
* 使`DROP TRIGGER IF EXISTS`
* `TABLE.NOTE``NoteColumns.GTASK_ID`Google Tasks
* `ContentValues``db.insert`
*
* @param db `SQLiteDatabase`23
*/
private void upgradeToV3(SQLiteDatabase db) {
// drop unused triggers
// 删除名为“update_note_modified_date_on_insert”的触发器如果存在的话可能该触发器在新版本中不再需要使用
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
// 删除名为“update_note_modified_date_on_delete”的触发器若存在
// 这个触发器或许是在删除笔记记录时对笔记修改日期进行相关处理的由于业务逻辑变更等原因在版本3中不再使用因此将其删除
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete");
// 删除名为“update_note_modified_date_on_update”的触发器如果有
// 同理,该触发器可能是在更新笔记记录时涉及笔记修改日期操作的,在新的版本里此功能不再需要,所以要删除掉这个触发器。
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update");
// add a column for gtask id
// 向笔记表(`TABLE.NOTE`)添加一个新的列,名为`NoteColumns.GTASK_ID`用于存储与Google Tasks相关的标识符等信息。
// 数据类型定义为 `TEXT`(文本类型),并且设置该列的默认值为空字符串 `''`。
// 通过 `ALTER TABLE` 语句实现对表结构的修改添加新列以满足新的业务需求比如可能用于后续与Google Tasks服务交互时标记笔记对应的任务等功能。
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
+ " TEXT NOT NULL DEFAULT ''");
// add a trash system folder
// 创建一个 `ContentValues` 对象,用于存储要插入到数据库表中的数据(以键值对的形式)。
// 这里准备向笔记表(`TABLE.NOTE`)中插入一条新的系统文件夹记录,即回收站文件夹的记录信息。
ContentValues values = new ContentValues();
// 将回收站文件夹的唯一标识符(`Notes.ID_TRASH_FOLER`,应该是在别处定义好的常量)设置到 `NoteColumns.ID` 列中,
// 以此确定这个记录对应的文件夹的唯一标识,方便后续对该文件夹进行操作和识别
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
// 设置该文件夹的类型为 `Notes.TYPE_SYSTEM`,表明这是一个系统文件夹,用于和普通用户创建的文件夹进行区分,
// 系统文件夹通常具有特定的功能和管理方式,例如回收站文件夹有其特殊的处理逻辑(如还原、彻底删除等操作)
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
// 使用 `db.insert` 方法将包含上述设置好的列值的记录插入到笔记表(`TABLE.NOTE`)中。
// 第一个参数指定要插入数据的表名(这里就是 `TABLE.NOTE`),第二个参数通常用于指定如果插入的数据为空值时对应的处理策略(这里传 `null` 表示按默认方式处理),
// 第三个参数就是包含了要插入的具体数据的 `ContentValues` 对象。通过这个插入操作,就在数据库中创建了回收站文件夹的记录信息。
db.insert(TABLE.NOTE, null, values);
}
private void upgradeToV4(SQLiteDatabase db) {
// 使用 `ALTER TABLE` 语句来修改笔记表(`TABLE.NOTE`)的结构。
// 具体操作是添加一个新的列,列名为 `NoteColumns.VERSION`,这个列名通常在相关的列定义常量类(如 `Notes` 类中应该有对应定义)中有具体的定义和含义。
// 该列的数据类型被定义为 `INTEGER`(整数类型),并且设置其默认值为 `0`。添加这个版本列可能用于记录笔记数据本身的版本情况,
// 例如,随着应用功能迭代,笔记数据结构可能有变化,通过这个版本号可以方便地进行数据兼容性处理、区分不同阶段的笔记格式等操作,有助于维护数据的一致性和正确处理。
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
}
Loading…
Cancel
Save