xiangjiawei

main
xiangjiawei 7 months ago
parent fbd9f8a919
commit 627c7c48a1

@ -34,7 +34,7 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE; import net.micode.notes.data.NotesDatabaseHelper.TABLE;
public class NotesProvider extends ContentProvider { public class NotesProvider extends ContentProvider {
// UriMatcher用于匹配不同的URI请求返回相应的请求类型 // UriMatcher用于匹配不同的URI请求帮助识别是请求笔记还是笔记数据,或是搜索请求等,并返回相应的请求类型代码
private static final UriMatcher mMatcher; private static final UriMatcher mMatcher;
// 数据库辅助类,用于创建和管理数据库 // 数据库辅助类,用于创建和管理数据库
@ -52,7 +52,7 @@ public class NotesProvider extends ContentProvider {
private static final int URI_SEARCH = 5; // 匹配搜索请求的URI private static final int URI_SEARCH = 5; // 匹配搜索请求的URI
private static final int URI_SEARCH_SUGGEST = 6; // 匹配搜索建议请求的URI private static final int URI_SEARCH_SUGGEST = 6; // 匹配搜索建议请求的URI
// 静态代码块在类加载时初始化UriMatcher // 静态代码块在类加载时初始化UriMatcher添加各种URI模式及其对应的代码
static { static {
mMatcher = new UriMatcher(UriMatcher.NO_MATCH); mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE);
@ -67,6 +67,7 @@ public class NotesProvider extends ContentProvider {
/** /**
* x'0A'sqlite'\n' * x'0A'sqlite'\n'
* '\n'便 * '\n'便
* ID便
*/ */
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
+ NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
@ -76,21 +77,21 @@ public class NotesProvider extends ContentProvider {
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
// SQL查询语句用于根据搜索字符串查询笔记片段 // SQL查询语句用于根据搜索字符串查询笔记片段。查询结果将用于搜索功能和搜索建议。
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
+ " FROM " + TABLE.NOTE + " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
// 创建ContentProvider时调用初始化NotesDatabaseHelper // 创建ContentProvider时调用初始化NotesDatabaseHelper以准备数据库操作
@Override @Override
public boolean onCreate() { public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext()); // 获取数据库帮助器的单例实例 mHelper = NotesDatabaseHelper.getInstance(getContext()); // 获取数据库帮助器的单例实例
return true; return true;
} }
// 根据不同的URI请求类型执行查询操作 // 根据不同的URI请求类型执行查询操作,返回查询结果的游标
@Override @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) { String sortOrder) {
@ -99,28 +100,28 @@ public class NotesProvider extends ContentProvider {
String id = null; String id = null;
switch (mMatcher.match(uri)) { switch (mMatcher.match(uri)) {
case URI_NOTE: 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; break;
case URI_NOTE_ITEM: case URI_NOTE_ITEM:
// 查询特定ID的笔记 // 查询特定ID的笔记,返回符合条件的单条笔记游标
id = uri.getPathSegments().get(1); // 获取URI路径中的笔记ID id = uri.getPathSegments().get(1); // 获取URI路径中的笔记ID
c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs, null, null, sortOrder); + parseSelection(selection), selectionArgs, null, null, sortOrder);
break; break;
case URI_DATA: 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; break;
case URI_DATA_ITEM: case URI_DATA_ITEM:
// 查询特定ID的笔记数据 // 查询特定ID的笔记数据,返回符合条件的单条笔记数据游标
id = uri.getPathSegments().get(1); // 获取URI路径中的笔记数据ID id = uri.getPathSegments().get(1); // 获取URI路径中的笔记数据ID
c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs, null, null, sortOrder); + parseSelection(selection), selectionArgs, null, null, sortOrder);
break; break;
case URI_SEARCH: case URI_SEARCH:
case URI_SEARCH_SUGGEST: case URI_SEARCH_SUGGEST:
// 搜索时不允许指定排序条件、选择条件、选择参数或投影 // 搜索时不允许指定排序条件、选择条件、选择参数或投影,以确保搜索结果的一致性
if (sortOrder != null || projection != null) { if (sortOrder != null || projection != null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"不允许在搜索时指定排序条件、选择条件、选择参数或投影"); "不允许在搜索时指定排序条件、选择条件、选择参数或投影");
@ -142,9 +143,9 @@ public class NotesProvider extends ContentProvider {
} }
try { try {
// 格式化搜索字符串使其可以用于LIKE查询 // 格式化搜索字符串使其可以用于LIKE查询。例如,如果搜索字符串是"abc",则格式化后的字符串是"%abc%"
searchString = String.format("%%%s%%", searchString); searchString = String.format("%%%s%%", searchString);
// 执行搜索查询 // 执行搜索查询,返回搜索结果游标
c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,
new String[] { searchString }); new String[] { searchString });
} catch (IllegalStateException ex) { } catch (IllegalStateException ex) {
@ -152,28 +153,28 @@ public class NotesProvider extends ContentProvider {
} }
break; break;
default: default:
// 如果URI请求类型未知抛出异常 // 如果URI请求类型未知抛出异常以提示错误
throw new IllegalArgumentException("未知的URI " + uri); throw new IllegalArgumentException("未知的URI " + uri);
} }
// 设置游标的通知URI以便内容变化时通知监听者 // 设置游标的通知URI以便内容变化时通知监听者。这有助于UI更新和数据同步。
if (c != null) { if (c != null) {
c.setNotificationUri(getContext().getContentResolver(), uri); c.setNotificationUri(getContext().getContentResolver(), uri);
} }
return c; return c; // 返回查询结果游标
} }
// 根据不同的URI请求类型插入数据 // 根据不同的URI请求类型插入数据返回插入数据的URI
@Override @Override
public Uri insert(Uri uri, ContentValues values) { public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写的数据库实例 SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写的数据库实例
long dataId = 0, noteId = 0, insertedId = 0; long dataId = 0, noteId = 0, insertedId = 0;
switch (mMatcher.match(uri)) { switch (mMatcher.match(uri)) {
case URI_NOTE: case URI_NOTE:
// 插入新的笔记 // 插入新的笔记返回插入笔记的ID
insertedId = noteId = db.insert(TABLE.NOTE, null, values); insertedId = noteId = db.insert(TABLE.NOTE, null, values);
break; break;
case URI_DATA: case URI_DATA:
// 插入新的笔记数据 // 插入新的笔记数据返回插入数据的ID
if (values.containsKey(DataColumns.NOTE_ID)) { if (values.containsKey(DataColumns.NOTE_ID)) {
noteId = values.getAsLong(DataColumns.NOTE_ID); // 获取关联的笔记ID noteId = values.getAsLong(DataColumns.NOTE_ID); // 获取关联的笔记ID
} else { } else {
@ -182,16 +183,16 @@ public class NotesProvider extends ContentProvider {
insertedId = dataId = db.insert(TABLE.DATA, null, values); insertedId = dataId = db.insert(TABLE.DATA, null, values);
break; break;
default: default:
// 如果URI请求类型未知抛出异常 // 如果URI请求类型未知抛出异常以提示错误
throw new IllegalArgumentException("未知的URI " + uri); throw new IllegalArgumentException("未知的URI " + uri);
} }
// 通知笔记URI变化 // 通知笔记URI变化以便UI更新和数据同步
if (noteId > 0) { if (noteId > 0) {
getContext().getContentResolver().notifyChange( getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);
} }
// 通知数据URI变化 // 通知数据URI变化以便UI更新和数据同步
if (dataId > 0) { if (dataId > 0) {
getContext().getContentResolver().notifyChange( getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
@ -200,7 +201,7 @@ public class NotesProvider extends ContentProvider {
return ContentUris.withAppendedId(uri, insertedId); // 返回插入数据的URI return ContentUris.withAppendedId(uri, insertedId); // 返回插入数据的URI
} }
// 根据不同的URI请求类型删除数据 // 根据不同的URI请求类型删除数据,返回删除的数据条目数
@Override @Override
public int delete(Uri uri, String selection, String[] selectionArgs) { public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0; int count = 0;
@ -209,8 +210,8 @@ public class NotesProvider extends ContentProvider {
boolean deleteData = false; boolean deleteData = false;
switch (mMatcher.match(uri)) { switch (mMatcher.match(uri)) {
case URI_NOTE: case URI_NOTE:
// 删除笔记时确保ID大于0 // 删除笔记时确保ID大于0,以防止删除系统文件夹
selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; selection = " AND (" + selection + ") AND " + NoteColumns.ID + ">0 ";
count = db.delete(TABLE.NOTE, selection, selectionArgs); count = db.delete(TABLE.NOTE, selection, selectionArgs);
break; break;
case URI_NOTE_ITEM: case URI_NOTE_ITEM:
@ -237,10 +238,10 @@ public class NotesProvider extends ContentProvider {
deleteData = true; deleteData = true;
break; break;
default: default:
// 如果URI请求类型未知抛出异常 // 如果URI请求类型未知抛出异常以提示错误
throw new IllegalArgumentException("未知的URI " + uri); throw new IllegalArgumentException("未知的URI " + uri);
} }
// 如果有数据被删除通知URI变化 // 如果有数据被删除通知URI变化以便UI更新和数据同步
if (count > 0) { if (count > 0) {
if (deleteData) { if (deleteData) {
getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); // 通知笔记URI变化 getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); // 通知笔记URI变化
@ -250,7 +251,7 @@ public class NotesProvider extends ContentProvider {
return count; // 返回删除的数据条目数 return count; // 返回删除的数据条目数
} }
// 根据不同的URI请求类型更新数据 // 根据不同的URI请求类型更新数据,返回更新的数据条目数
@Override @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0; int count = 0;
@ -259,7 +260,7 @@ public class NotesProvider extends ContentProvider {
boolean updateData = false; boolean updateData = false;
switch (mMatcher.match(uri)) { switch (mMatcher.match(uri)) {
case URI_NOTE: case URI_NOTE:
// 更新笔记时,增加笔记版本号 // 更新笔记时,增加笔记版本号,以记录笔记的修改历史
increaseNoteVersion(-1, selection, selectionArgs); increaseNoteVersion(-1, selection, selectionArgs);
count = db.update(TABLE.NOTE, values, selection, selectionArgs); count = db.update(TABLE.NOTE, values, selection, selectionArgs);
break; break;
@ -284,11 +285,11 @@ public class NotesProvider extends ContentProvider {
updateData = true; updateData = true;
break; break;
default: default:
// 如果URI请求类型未知抛出异常 // 如果URI请求类型未知抛出异常以提示错误
throw new IllegalArgumentException("未知的URI " + uri); throw new IllegalArgumentException("未知的URI " + uri);
} }
// 如果有数据被更新通知URI变化 // 如果有数据被更新通知URI变化以便UI更新和数据同步
if (count > 0) { if (count > 0) {
if (updateData) { if (updateData) {
getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); // 通知笔记URI变化 getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); // 通知笔记URI变化
@ -298,13 +299,13 @@ public class NotesProvider extends ContentProvider {
return count; // 返回更新的数据条目数 return count; // 返回更新的数据条目数
} }
// 解析选择条件字符串如果存在选择条件则添加到SQL查询中 // 解析选择条件字符串如果存在选择条件则添加到SQL查询中。用于处理动态SQL查询条件
private String parseSelection(String selection) { private String parseSelection(String selection) {
// 如果选择条件不为空则将其添加到SQL查询中 // 如果选择条件不为空则将其添加到SQL查询中
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
} }
// 增加笔记版本号 // 增加笔记版本号用于记录笔记的修改历史。每当笔记被更新时版本号会自动加1
private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
StringBuilder sql = new StringBuilder(120); StringBuilder sql = new StringBuilder(120);
sql.append("UPDATE "); sql.append("UPDATE ");
@ -313,7 +314,7 @@ public class NotesProvider extends ContentProvider {
sql.append(NoteColumns.VERSION); sql.append(NoteColumns.VERSION);
sql.append("=" + NoteColumns.VERSION + "+1 "); // 将笔记版本号加1 sql.append("=" + NoteColumns.VERSION + "+1 "); // 将笔记版本号加1
// 构建WHERE子句 // 构建WHERE子句,以指定更新哪个笔记
if (id > 0 || !TextUtils.isEmpty(selection)) { if (id > 0 || !TextUtils.isEmpty(selection)) {
sql.append(" WHERE "); sql.append(" WHERE ");
} }
@ -328,11 +329,11 @@ public class NotesProvider extends ContentProvider {
sql.append(selectString); sql.append(selectString);
} }
// 执行更新操作 // 执行更新操作,增加笔记的版本号
mHelper.getWritableDatabase().execSQL(sql.toString()); mHelper.getWritableDatabase().execSQL(sql.toString());
} }
// 返回URI对应的数据类型这里未实现返回null // 返回URI对应的数据类型。这里未实现返回null。通常需要根据URI返回相应的MIME类型。
@Override @Override
public String getType(Uri uri) { public String getType(Uri uri) {
// TODO Auto-generated method stub // TODO Auto-generated method stub

Loading…
Cancel
Save