From 584750e580eaab088ec5dc7654bc7ef4a9738e75 Mon Sep 17 00:00:00 2001 From: gy <2293314358@qq.com> Date: Tue, 23 Dec 2025 15:19:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9NotesDatabaseHelper=E4=B8=8ENotesProvi?= =?UTF-8?q?der=E4=B8=A4=E4=B8=AA=E7=B1=BB=E8=BF=9B=E8=A1=8C=E4=BA=86?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=B8=8E=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notes/data/NotesDatabaseHelper.java | 74 +++++++++++++++++- .../net/micode/notes/data/NotesProvider.java | 77 +++++++++++++++++-- 2 files changed, 140 insertions(+), 11 deletions(-) diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index 564227e..9e9f86c 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -22,26 +22,39 @@ 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; //导入声明数据表中的专用列名 +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +/** + * 笔记应用的数据库助手类,负责创建和管理SQLite数据库 + * 包括表结构定义、触发器创建、系统文件夹初始化和数据库版本升级 + */ 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; + // 创建笔记表的SQL语句 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -63,6 +76,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + ")"; + // 创建数据内容表的SQL语句 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + @@ -78,6 +92,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + ")"; + // 为数据内容表的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 + ");"; @@ -206,10 +221,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " END"; + /** + * 构造方法 + * @param context 上下文对象 + */ 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); @@ -217,6 +240,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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"); @@ -235,6 +262,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } + /** + * 创建系统文件夹 + * @param db SQLite数据库对象 + */ private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); @@ -270,6 +301,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } + /** + * 创建数据内容表 + * @param db SQLite数据库对象 + */ public void createDataTable(SQLiteDatabase db) { db.execSQL(CREATE_DATA_TABLE_SQL); reCreateDataTableTriggers(db); @@ -277,6 +312,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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"); @@ -287,6 +326,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); } + /** + * 获取单例实例 + * @param context 上下文对象 + * @return NotesDatabaseHelper实例 + */ static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); @@ -294,12 +338,22 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { return mInstance; } + /** + * 创建数据库时调用 + * @param db SQLite数据库对象 + */ @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } + /** + * 数据库版本升级时调用 + * @param db SQLite数据库对象 + * @param oldVersion 旧版本号 + * @param newVersion 新版本号 + */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; @@ -333,6 +387,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { } } + /** + * 升级数据库到版本2 + * @param db SQLite数据库对象 + */ private void upgradeToV2(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); @@ -340,6 +398,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createDataTable(db); } + /** + * 升级数据库到版本3 + * @param db SQLite数据库对象 + */ private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); @@ -355,6 +417,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } + /** + * 升级数据库到版本4 + * @param db SQLite数据库对象 + */ private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); diff --git a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java index edb0a60..f951ad9 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java @@ -35,20 +35,27 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; +/** + * 笔记应用的ContentProvider,负责处理所有数据操作请求 + * 包括笔记和数据内容的增删改查,以及搜索功能 + */ public class NotesProvider extends ContentProvider { + // Uri匹配器,用于解析不同的请求URI private static final UriMatcher mMatcher; + // 数据库助手实例 private NotesDatabaseHelper mHelper; + // 日志标签 private static final String TAG = "NotesProvider"; - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; - - private static final int URI_SEARCH = 5; - private static final int URI_SEARCH_SUGGEST = 6; + // Uri匹配规则常量 + private static final int URI_NOTE = 1; // 所有笔记 + private static final int URI_NOTE_ITEM = 2; // 单个笔记 + private static final int URI_DATA = 3; // 所有数据内容 + private static final int URI_DATA_ITEM = 4; // 单个数据内容 + private static final int URI_SEARCH = 5; // 搜索 + private static final int URI_SEARCH_SUGGEST = 6; // 搜索建议 static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -65,6 +72,7 @@ public class NotesProvider extends ContentProvider { * x'0A' represents the '\n' character in sqlite. For title and content in the search result, * we will trim '\n' and white space in order to show more information. */ + // 搜索结果的投影列定义 private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," @@ -73,18 +81,33 @@ public class NotesProvider extends ContentProvider { + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + // 搜索笔记内容的SQL查询语句 private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + " FROM " + TABLE.NOTE + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + /** + * ContentProvider创建时调用,初始化数据库助手 + * @return true表示创建成功 + */ @Override public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } + /** + * 查询数据 + * @param uri 请求的URI + * @param projection 返回的列 + * @param selection 选择条件 + * @param selectionArgs 选择条件的参数 + * @param sortOrder 排序方式 + * @return 查询结果的Cursor + * @throws IllegalArgumentException 当URI不合法时抛出 + */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { @@ -147,6 +170,13 @@ public class NotesProvider extends ContentProvider { return c; } + /** + * 插入数据 + * @param uri 请求的URI + * @param values 要插入的数据 + * @return 插入数据的URI + * @throws IllegalArgumentException 当URI不合法时抛出 + */ @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = mHelper.getWritableDatabase(); @@ -181,6 +211,14 @@ public class NotesProvider extends ContentProvider { return ContentUris.withAppendedId(uri, insertedId); } + /** + * 删除数据 + * @param uri 请求的URI + * @param selection 删除条件 + * @param selectionArgs 删除条件的参数 + * @return 删除的行数 + * @throws IllegalArgumentException 当URI不合法时抛出 + */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; @@ -227,6 +265,15 @@ public class NotesProvider extends ContentProvider { return count; } + /** + * 更新数据 + * @param uri 请求的URI + * @param values 要更新的数据 + * @param selection 更新条件 + * @param selectionArgs 更新条件的参数 + * @return 更新的行数 + * @throws IllegalArgumentException 当URI不合法时抛出 + */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; @@ -267,10 +314,21 @@ public class NotesProvider extends ContentProvider { return count; } + /** + * 解析选择条件,添加到已有的条件中 + * @param selection 要解析的选择条件 + * @return 解析后的选择条件 + */ private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } + /** + * 增加笔记版本号 + * @param id 笔记ID,-1表示所有笔记 + * @param selection 选择条件 + * @param selectionArgs 选择条件的参数 + */ private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -296,6 +354,11 @@ public class NotesProvider extends ContentProvider { mHelper.getWritableDatabase().execSQL(sql.toString()); } + /** + * 获取URI对应的MIME类型 + * @param uri 请求的URI + * @return MIME类型,当前未实现 + */ @Override public String getType(Uri uri) { // TODO Auto-generated method stub -- 2.34.1