From 1af54fe5ac188d0a8491f9d19283bfb83f635377 Mon Sep 17 00:00:00 2001 From: pwiz98tyo <1257800485@qq.com> Date: Thu, 12 Jun 2025 15:00:01 +0800 Subject: [PATCH] Update NotesProvider.java --- java/net/micode/notes/data/NotesProvider.java | 147 +++++++++++------- 1 file changed, 91 insertions(+), 56 deletions(-) diff --git a/java/net/micode/notes/data/NotesProvider.java b/java/net/micode/notes/data/NotesProvider.java index edb0a60..db252ea 100644 --- a/java/net/micode/notes/data/NotesProvider.java +++ b/java/net/micode/notes/data/NotesProvider.java @@ -16,7 +16,6 @@ package net.micode.notes.data; - import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentUris; @@ -34,37 +33,32 @@ import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; - public class NotesProvider extends ContentProvider { - private static final UriMatcher mMatcher; - - private NotesDatabaseHelper mHelper; - - private static final String TAG = "NotesProvider"; + private static final UriMatcher mMatcher; // URI匹配器,用于识别不同的URI + 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; // 笔记集合URI + private static final int URI_NOTE_ITEM = 2; // 单个笔记URI + private static final int URI_DATA = 3; // 数据集合URI + private static final int URI_DATA_ITEM = 4; // 单个数据URI + private static final int URI_SEARCH = 5; // 搜索URI + private static final int URI_SEARCH_SUGGEST = 6; // 搜索建议URI + // 静态初始化块,设置URI匹配规则 static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); // 匹配所有笔记 + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); // 匹配单个笔记 + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); // 匹配所有数据 + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); // 匹配单个数据 + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); // 匹配搜索 + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); // 匹配搜索建议 + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); // 匹配带参数的搜索建议 } - /** - * 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. - */ + // 搜索投影和查询SQL 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 + "," @@ -79,42 +73,44 @@ public class NotesProvider extends ContentProvider { + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + // 初始化提供者 @Override public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } + // 查询数据 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor c = null; SQLiteDatabase db = mHelper.getReadableDatabase(); String id = null; + + // 根据URI匹配类型执行不同的查询 switch (mMatcher.match(uri)) { case URI_NOTE: - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); break; case URI_NOTE_ITEM: id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); + c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); break; case URI_DATA: - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, - sortOrder); + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); break; case URI_DATA_ITEM: id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); break; case URI_SEARCH: case URI_SEARCH_SUGGEST: + // 处理搜索请求 if (sortOrder != null || projection != null) { - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); + throw new IllegalArgumentException("不支持指定排序或投影"); } String searchString = null; @@ -132,25 +128,29 @@ public class NotesProvider extends ContentProvider { try { searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[] { searchString }); } catch (IllegalStateException ex) { - Log.e(TAG, "got exception: " + ex.toString()); + Log.e(TAG, "查询异常: " + ex.toString()); } break; default: - throw new IllegalArgumentException("Unknown URI " + uri); + throw new IllegalArgumentException("未知URI: " + uri); } + + // 设置内容观察者通知 if (c != null) { c.setNotificationUri(getContext().getContentResolver(), uri); } return c; } + // 插入数据 @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = mHelper.getWritableDatabase(); long dataId = 0, noteId = 0, insertedId = 0; + + // 根据URI匹配类型执行不同的插入操作 switch (mMatcher.match(uri)) { case URI_NOTE: insertedId = noteId = db.insert(TABLE.NOTE, null, values); @@ -159,20 +159,20 @@ public class NotesProvider extends ContentProvider { if (values.containsKey(DataColumns.NOTE_ID)) { noteId = values.getAsLong(DataColumns.NOTE_ID); } else { - Log.d(TAG, "Wrong data format without note id:" + values.toString()); + Log.d(TAG, "数据格式错误,缺少笔记ID: " + values.toString()); } insertedId = dataId = db.insert(TABLE.DATA, null, values); break; default: - throw new IllegalArgumentException("Unknown URI " + uri); + throw new IllegalArgumentException("未知URI: " + uri); } - // Notify the note uri + + // 通知数据变化 if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); } - // Notify the data uri if (dataId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); @@ -181,12 +181,15 @@ public class NotesProvider extends ContentProvider { return ContentUris.withAppendedId(uri, insertedId); } + // 删除数据 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; String id = null; SQLiteDatabase db = mHelper.getWritableDatabase(); boolean deleteData = false; + + // 根据URI匹配类型执行不同的删除操作 switch (mMatcher.match(uri)) { case URI_NOTE: selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; @@ -194,10 +197,7 @@ public class NotesProvider extends ContentProvider { break; case URI_NOTE_ITEM: id = uri.getPathSegments().get(1); - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ + // 系统文件夹不允许删除 long noteId = Long.valueOf(id); if (noteId <= 0) { break; @@ -216,8 +216,10 @@ public class NotesProvider extends ContentProvider { deleteData = true; break; default: - throw new IllegalArgumentException("Unknown URI " + uri); + throw new IllegalArgumentException("未知URI: " + uri); } + + // 通知数据变化 if (count > 0) { if (deleteData) { getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); @@ -227,12 +229,15 @@ public class NotesProvider extends ContentProvider { return count; } + // 更新数据 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; String id = null; SQLiteDatabase db = mHelper.getWritableDatabase(); boolean updateData = false; + + // 根据URI匹配类型执行不同的更新操作 switch (mMatcher.match(uri)) { case URI_NOTE: increaseNoteVersion(-1, selection, selectionArgs); @@ -241,8 +246,8 @@ public class NotesProvider extends ContentProvider { case URI_NOTE_ITEM: id = uri.getPathSegments().get(1); increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); + count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id + parseSelection(selection), + selectionArgs); break; case URI_DATA: count = db.update(TABLE.DATA, values, selection, selectionArgs); @@ -250,14 +255,15 @@ public class NotesProvider extends ContentProvider { break; case URI_DATA_ITEM: id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); + count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id + parseSelection(selection), + selectionArgs); updateData = true; break; default: - throw new IllegalArgumentException("Unknown URI " + uri); + throw new IllegalArgumentException("未知URI: " + uri); } + // 通知数据变化 if (count > 0) { if (updateData) { getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); @@ -267,10 +273,12 @@ public class NotesProvider extends ContentProvider { return count; } + // 解析查询条件 private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } + // 增加笔记版本号 private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -296,10 +304,37 @@ public class NotesProvider extends ContentProvider { mHelper.getWritableDatabase().execSQL(sql.toString()); } + // 获取内容类型 @Override public String getType(Uri uri) { - // TODO Auto-generated method stub - return null; + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 返回笔记集合的MIME类型 + return Notes.TextNote.CONTENT_TYPE; + + case URI_NOTE_ITEM: + // 返回单个笔记的MIME类型 + return Notes.TextNote.CONTENT_ITEM_TYPE; + + case URI_DATA: + // 返回数据集合的MIME类型 + return Notes.Data.CONTENT_TYPE; + + case URI_DATA_ITEM: + // 返回单个数据的MIME类型 + return Notes.Data.CONTENT_ITEM_TYPE; + + case URI_SEARCH: + // 返回搜索结果的MIME类型 + return Notes.TextNote.CONTENT_TYPE; + + case URI_SEARCH_SUGGEST: + // 返回搜索建议的MIME类型 + return SearchManager.SUGGEST_MIME_TYPE; + + default: + throw new IllegalArgumentException("Unknown URI: " + uri); + } } - } +