|
|
package com.example.myapplication.data;
|
|
|
|
|
|
import android.content.Context;
|
|
|
import android.database.sqlite.SQLiteDatabase;
|
|
|
import android.database.sqlite.SQLiteOpenHelper;
|
|
|
|
|
|
public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
|
private static final String DB_NAME = "note.db";
|
|
|
private static final int DB_VERSION = 1;
|
|
|
|
|
|
// 定义表名常量(或者直接使用 NoteColumns.TABLE_NAME)
|
|
|
private static final String TABLE_NOTE = NoteColumns.TABLE_NAME;
|
|
|
private static final String TABLE_DATA = NoteColumns.TABLE_DATA;
|
|
|
|
|
|
// 创建 notes 表
|
|
|
private static final String CREATE_NOTE_TABLE_SQL =
|
|
|
"CREATE TABLE " + TABLE_NOTE + " (" +
|
|
|
NoteColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
|
|
|
NoteColumns.COLUMN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), " +
|
|
|
NoteColumns.COLUMN_HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), " +
|
|
|
NoteColumns.COLUMN_NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_SNIPPET + " TEXT NOT NULL DEFAULT '', " +
|
|
|
NoteColumns.COLUMN_TYPE + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_WIDGET_ID + " INTEGER NOT NULL DEFAULT -1, " +
|
|
|
NoteColumns.COLUMN_WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1, " +
|
|
|
NoteColumns.COLUMN_SYNC_ID + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_GTASK_ID + " TEXT NOT NULL DEFAULT '', " +
|
|
|
NoteColumns.COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0" +
|
|
|
")";
|
|
|
|
|
|
// 创建 data 表
|
|
|
private static final String CREATE_DATA_TABLE_SQL =
|
|
|
"CREATE TABLE " + TABLE_DATA + " (" +
|
|
|
NoteColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
|
|
|
DataColumns.MIME_TYPE + " TEXT NOT NULL, " +
|
|
|
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0, " +
|
|
|
NoteColumns.COLUMN_CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), " +
|
|
|
NoteColumns.COLUMN_MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), " +
|
|
|
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 + ")";
|
|
|
|
|
|
// 触发器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.COLUMN_NOTES_COUNT + " = " + NoteColumns.COLUMN_NOTES_COUNT + " + 1 " +
|
|
|
" WHERE " + NoteColumns._ID + " = new." + NoteColumns.COLUMN_PARENT_ID + "; " +
|
|
|
"END";
|
|
|
|
|
|
// 触发器2:删除笔记时减少文件夹计数
|
|
|
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.COLUMN_NOTES_COUNT + " = " + NoteColumns.COLUMN_NOTES_COUNT + " - 1 " +
|
|
|
" WHERE " + NoteColumns._ID + " = old." + NoteColumns.COLUMN_PARENT_ID + " " +
|
|
|
" AND " + NoteColumns.COLUMN_NOTES_COUNT + " > 0; " +
|
|
|
"END";
|
|
|
|
|
|
// 触发器3:插入 data 时更新笔记内容
|
|
|
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.COLUMN_SNIPPET + " = new." + DataColumns.CONTENT + " " +
|
|
|
" WHERE " + NoteColumns._ID + " = new." + DataColumns.NOTE_ID + "; " +
|
|
|
"END";
|
|
|
|
|
|
// 触发器4:更新 data 时更新笔记内容
|
|
|
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.COLUMN_SNIPPET + " = new." + DataColumns.CONTENT + " " +
|
|
|
" WHERE " + NoteColumns._ID + " = new." + DataColumns.NOTE_ID + "; " +
|
|
|
"END";
|
|
|
|
|
|
public NotesDatabaseHelper(Context context) {
|
|
|
super(context, DB_NAME, null, DB_VERSION);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onCreate(SQLiteDatabase db) {
|
|
|
db.execSQL(CREATE_NOTE_TABLE_SQL);
|
|
|
db.execSQL(CREATE_DATA_TABLE_SQL);
|
|
|
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
|
|
|
|
|
|
// 创建触发器
|
|
|
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
|
|
|
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);
|
|
|
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
|
|
|
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
|
|
// 删除所有触发器
|
|
|
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");
|
|
|
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");
|
|
|
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 TABLE IF EXISTS " + TABLE_NOTE);
|
|
|
db.execSQL("DROP TABLE IF EXISTS " + TABLE_DATA);
|
|
|
|
|
|
// 重新创建
|
|
|
onCreate(db);
|
|
|
}
|
|
|
}
|