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.
git-test/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java

567 lines
24 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 {
// 数据库名称
private static final String DB_NAME = "note.db";
// 数据库版本号
private static final int DB_VERSION = 9;
// 数据库表名定义
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;
// 创建笔记表的SQL语句
// 笔记表存储笔记和文件夹的基本信息,包括:
// - ID唯一标识符
// - PARENT_ID父文件夹ID
// - ALERTED_DATE提醒日期
// - BG_COLOR_ID背景颜色ID
// - CREATED_DATE创建日期
// - HAS_ATTACHMENT是否有附件
// - MODIFIED_DATE修改日期
// - NOTES_COUNT子笔记数量仅文件夹使用
// - SNIPPET笔记内容片段或文件夹名称
// - TYPE类型笔记、文件夹、系统文件夹
// - WIDGET_ID关联的小部件ID
// - WIDGET_TYPE小部件类型
// - SYNC_ID同步ID
// - LOCAL_MODIFIED本地是否修改
// - ORIGIN_PARENT_ID原始父文件夹ID
// - GTASK_IDGoogle任务ID
// - VERSION版本号
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," +
NoteColumns.IS_PINNED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.PIN_PRIORITY + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.IS_LOCKED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCK_PASSWORD + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.TAGS + " TEXT NOT NULL DEFAULT ''" +
")";
// 创建数据表的SQL语句
// 数据表存储笔记的详细内容,支持多种类型的笔记数据,包括:
// - ID唯一标识符
// - MIME_TYPE数据类型如文本笔记、通话笔记等
// - NOTE_ID关联的笔记ID
// - CREATED_DATE创建日期
// - MODIFIED_DATE修改日期
// - CONTENT数据内容
// - DATA1, DATA2, DATA3, DATA4, DATA5扩展字段根据不同数据类型存储不同信息
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 ''" +
")";
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
/**
* 当将笔记移动到文件夹时,增加文件夹的笔记计数
*/
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";
/**
* 当将笔记从文件夹移出时,减少文件夹的笔记计数
*/
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";
/**
* 当向文件夹插入新笔记时,增加文件夹的笔记计数
*/
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";
/**
* 当从文件夹删除笔记时,减少文件夹的笔记计数
*/
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";
/**
* 当插入类型为普通笔记的数据时,更新笔记内容
*/
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";
/**
* 当类型为普通笔记的数据发生变化时,更新笔记内容
*/
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";
/**
* 当类型为普通笔记的数据被删除时,更新笔记内容
*/
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";
/**
* 删除属于已删除笔记的数据
*/
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";
/**
* 删除属于已删除文件夹的笔记
*/
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";
/**
* 将属于已移至回收站的文件夹的笔记也移至回收站
*/
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";
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 创建笔记表及其相关触发器和系统文件夹
* @param db SQLite数据库实例
*/
public void createNoteTable(SQLiteDatabase db) {
// 创建笔记表
db.execSQL(CREATE_NOTE_TABLE_SQL);
// 重新创建笔记表相关触发器
reCreateNoteTableTriggers(db);
// 创建系统文件夹
createSystemFolder(db);
// 记录日志
Log.d(TAG, "note table has been created");
}
/**
* 重新创建笔记表相关触发器,确保触发器的正确性和一致性
* @param db SQLite数据库实例
*/
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 SQLite数据库实例
*/
private void createSystemFolder(SQLiteDatabase db) {
ContentValues values = new ContentValues();
// 创建通话记录文件夹:用于存储通话记录
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建根文件夹:默认文件夹,用于存储普通笔记
values.clear();
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建临时文件夹:用于移动笔记时的临时存储
values.clear();
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建回收站文件夹:用于存储被删除的笔记和文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
}
/**
* 获取NotesDatabaseHelper的单例实例
* 使用同步方法确保线程安全,避免多线程环境下创建多个实例
* @param context 上下文对象
* @return NotesDatabaseHelper的单例实例
*/
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
}
/**
* 创建数据表及其相关触发器和索引
* @param db SQLite数据库实例
*/
public void createDataTable(SQLiteDatabase db) {
// 创建数据表
db.execSQL(CREATE_DATA_TABLE_SQL);
// 重新创建数据表相关触发器
reCreateDataTableTriggers(db);
// 为data表的note_id字段创建索引提高查询效率
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
// 记录日志
Log.d(TAG, "data table has been created");
}
/**
* 重新创建数据表相关触发器,确保触发器的正确性和一致性
* @param db SQLite数据库实例
*/
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); // 删除文本笔记数据时清空笔记内容
}
/**
* 创建数据库时调用,初始化数据库表结构和数据
* @param db SQLite数据库实例
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 创建笔记表及其相关触发器和系统文件夹
createNoteTable(db);
// 创建数据表及其相关触发器和索引
createDataTable(db);
}
/**
* 数据库升级时调用,处理不同版本之间的升级逻辑
* @param db SQLite数据库实例
* @param oldVersion 旧数据库版本号
* @param newVersion 新数据库版本号
* @throws IllegalStateException 升级失败时抛出异常
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false; // 是否需要重新创建触发器
boolean skipV2 = false; // 是否跳过v2版本升级
// 从v1升级到v2
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // v2到v3的升级已包含在v1到v2的升级中
oldVersion++;
}
// 从v2升级到v3
if (oldVersion == 2 && !skipV2) {
upgradeToV3(db);
reCreateTriggers = true; // v3升级需要重新创建触发器
oldVersion++;
}
// 从v3升级到v4
if (oldVersion == 3) {
upgradeToV4(db);
oldVersion++;
}
// 从v4升级到v5
if (oldVersion == 4) {
upgradeToV5(db);
oldVersion++;
}
if (oldVersion == 5) {
upgradeToV6(db);
oldVersion++;
}
if (oldVersion == 6) {
upgradeToV7(db);
oldVersion++;
}
if (oldVersion == 7) {
upgradeToV8(db);
oldVersion++;
}
if (oldVersion == 8) {
upgradeToV9(db);
oldVersion++;
}
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
reCreateDataTableTriggers(db);
}
// 检查升级是否成功
if (oldVersion != newVersion) {
throw new IllegalStateException("Upgrade notes database to version " + newVersion + " fails");
}
}
/**
* 将数据库从v1升级到v2
* 此版本升级重建了整个数据库结构
* @param db SQLite数据库实例
*/
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);
}
/**
* 将数据库从v2升级到v3
* 此版本升级添加了Google任务ID字段和回收站文件夹
* @param db SQLite数据库实例
*/
private void upgradeToV3(SQLiteDatabase db) {
// 删除不再使用的触发器
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");
// 为笔记表添加Google任务ID字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
+ " TEXT NOT NULL DEFAULT ''");
// 添加回收站系统文件夹
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);
}
/**
* 将数据库从v3升级到v4
* 此版本升级添加了版本号字段,用于记录笔记的版本
* @param db SQLite数据库实例
*/
private void upgradeToV4(SQLiteDatabase db) {
// 为笔记表添加版本号字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
/**
* 将数据库从v4升级到v5
* 此版本升级添加了置顶状态和置顶优先级字段,用于支持便签置顶功能
* @param db SQLite数据库实例
*/
private void upgradeToV5(SQLiteDatabase db) {
// 为笔记表添加置顶状态字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.IS_PINNED
+ " INTEGER NOT NULL DEFAULT 0");
// 为笔记表添加置顶优先级字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PIN_PRIORITY
+ " INTEGER NOT NULL DEFAULT 0");
}
/**
* 将数据库从v5升级到v6
* 此版本升级添加了便签锁定状态和密码字段,用于支持便签密码锁功能
* @param db SQLite数据库实例
*/
private void upgradeToV6(SQLiteDatabase db) {
// 为笔记表添加锁定状态字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.IS_LOCKED
+ " INTEGER NOT NULL DEFAULT 0");
// 为笔记表添加密码字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.LOCK_PASSWORD
+ " TEXT NOT NULL DEFAULT ''");
}
/**
* 将数据库从v6升级到v7
* 此版本升级添加了密码类型字段,用于支持手势密码和数字密码
* @param db SQLite数据库实例
*/
private void upgradeToV7(SQLiteDatabase db) {
// 为笔记表添加密码类型字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PASSWORD_TYPE
+ " TEXT NOT NULL DEFAULT 'gesture'");
// 为笔记表添加数字密码字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.NUMERIC_PASSWORD
+ " TEXT NOT NULL DEFAULT ''");
}
/**
* 将数据库从v7升级到v8
* 此版本升级添加了标题字段,用于支持便签标题功能
* @param db SQLite数据库实例
*/
private void upgradeToV8(SQLiteDatabase db) {
// 为笔记表添加标题字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TITLE
+ " TEXT NOT NULL DEFAULT ''");
}
/**
* 将数据库从v8升级到v9
* 此版本升级添加了标签字段,用于支持便签标签功能
* @param db SQLite数据库实例
*/
private void upgradeToV9(SQLiteDatabase db) {
// 为笔记表添加标签字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TAGS
+ " TEXT NOT NULL DEFAULT ''");
}
}