From 552d4ec6a27da78033df8aff84b3d93aac1d3bd8 Mon Sep 17 00:00:00 2001 From: HZXhuang Date: Sat, 28 Oct 2023 22:35:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99NotesProvider.java=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/micode/notes/data/Notes.java | 4 +- .../net/micode/notes/data/NotesProvider.java | 2 +- .../java/net/micode/notes/model/Note.java | 123 ++++++++++++++++-- 3 files changed, 117 insertions(+), 12 deletions(-) diff --git a/src/mi_note/app/src/main/java/net/micode/notes/data/Notes.java b/src/mi_note/app/src/main/java/net/micode/notes/data/Notes.java index 3b63a63..0ffdf43 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/data/Notes.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/data/Notes.java @@ -317,12 +317,12 @@ public class Notes { } /** - * 数据字段接口的实现,调用便签 + * 数据字段接口的实现,电话内容 */ public static final class CallNote implements DataColumns { /** * Call date for this record - * 调用日期 + * 通话日期 *

Type: INTEGER (long)

*/ public static final String CALL_DATE = DATA1; diff --git a/src/mi_note/app/src/main/java/net/micode/notes/data/NotesProvider.java b/src/mi_note/app/src/main/java/net/micode/notes/data/NotesProvider.java index faa5b85..356f87d 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/data/NotesProvider.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/data/NotesProvider.java @@ -38,7 +38,7 @@ import net.micode.notes.data.NotesDatabaseHelper.TABLE; * @author hzx * 版本:1.0 * 创建日期:2023/10/28 - * 描述:NotesProvider 便签内容提供者 + * 描述:NotesProvider 便签内容提供者 向外提供便签增删改查的接口 */ public class NotesProvider extends ContentProvider { // Uri匹配器 diff --git a/src/mi_note/app/src/main/java/net/micode/notes/model/Note.java b/src/mi_note/app/src/main/java/net/micode/notes/model/Note.java index a3bbe22..23714e3 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/model/Note.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/model/Note.java @@ -38,14 +38,21 @@ import java.util.ArrayList; * @author hzx * 版本:1.0 * 创建日期:2023/10/28 - * 描述:Note + * 描述:Note 便签模型类 */ public class Note { + // 便签内容 private ContentValues mNoteDiffValues; + // 便签数据 private NoteData mNoteData; + // 日志标签 private static final String TAG = "Note"; + /** - * Create a new note id for adding a new note to databases + * 创建一个新的便签ID,以便将新的便签添加到数据库中 线程安全 + * @param context 上下文 + * @param folderId 文件夹ID + * @return long 便签ID */ public static synchronized long getNewNoteId(Context context, long folderId) { // Create a new note in the database @@ -60,8 +67,10 @@ public class Note { long noteId = 0; try { + // 从uri中获取便签ID noteId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { + // 从uri中获取便签ID失败 Log.e(TAG, "Get note id error :" + e.toString()); noteId = 0; } @@ -76,42 +85,81 @@ public class Note { mNoteData = new NoteData(); } + /** + * 将键值对存入mNoteDiffValues中 + * @param key 键 + * @param value 值 + */ public void setNoteValue(String key, String value) { mNoteDiffValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 将文本数据存入到mNoteData中 + * @param key 键 + * @param value 值 + */ public void setTextData(String key, String value) { mNoteData.setTextData(key, value); } + /** + * 设置mNoteData的文本数据id + * @param id 文本数据id + */ public void setTextDataId(long id) { mNoteData.setTextDataId(id); } + /** + * 获取mNoteData的文本数据id + * @return 文本数据id + */ public long getTextDataId() { return mNoteData.mTextDataId; } + /** + * 设置mNoteData的电话号码数据id + * @param id 电话号码数据id + */ public void setCallDataId(long id) { mNoteData.setCallDataId(id); } + /** + * 设置mNoteData的电话号码数据 + * @param key 键 + * @param value 值 + */ public void setCallData(String key, String value) { mNoteData.setCallData(key, value); } + /** + * 是否便签被本地修改 便签本身(mNoteDiffValues)被修改或便签的内容数据(mNoteData)被修改 + * @return true or false + */ public boolean isLocalModified() { return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); } + /** + * 同步便签 + * @param context 上下文 + * @param noteId 便签ID + * @return boolean 是否成功 + */ public boolean syncNote(Context context, long noteId) { if (noteId <= 0) { + // 便签ID不合法 throw new IllegalArgumentException("Wrong note id:" + noteId); } if (!isLocalModified()) { + // 如果便签没有被本地修改,直接返回true,不用同步了 return true; } @@ -123,41 +171,61 @@ public class Note { if (context.getContentResolver().update( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, null) == 0) { + // 更新失败 Log.e(TAG, "Update note error, should not happen"); // Do not return, fall through } + // 清空便签更新内容 mNoteDiffValues.clear(); + // 将本地更新的便签数据更新到数据库 if (mNoteData.isLocalModified() && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + // 更新失败 return false; } return true; } + /** + * 便签数据类 + */ private class NoteData { + // 文本数据ID private long mTextDataId; + // 文本数据修改内容,修改了但没写入数据库 private ContentValues mTextDataValues; + // 电话号码数据ID private long mCallDataId; + // 电话号码数据修改内容 private ContentValues mCallDataValues; private static final String TAG = "NoteData"; public NoteData() { + // 初始化 mTextDataValues = new ContentValues(); mCallDataValues = new ContentValues(); mTextDataId = 0; mCallDataId = 0; } + /** + * 便签内容是否被本地修改 + * @return true or false + */ boolean isLocalModified() { return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; } + /** + * 设置文本数据id + * @param id 文本数据id + */ void setTextDataId(long id) { if(id <= 0) { throw new IllegalArgumentException("Text data id should larger than 0"); @@ -165,6 +233,10 @@ public class Note { mTextDataId = id; } + /** + * 设置电话号码数据id + * @param id 电话号码数据id + */ void setCallDataId(long id) { if (id <= 0) { throw new IllegalArgumentException("Call data id should larger than 0"); @@ -172,75 +244,107 @@ public class Note { mCallDataId = id; } + /** + * 设置电话号码数据 + * @param key 键 + * @param value 值 + */ void setCallData(String key, String value) { mCallDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 设置便签文本数据 + * @param key 键 + * @param value 值 + */ void setTextData(String key, String value) { mTextDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 将更新的文本数据mTextDataValues和电话号码数据mCallDataValues插入或更新到数据库 + * @param context 上下文 + * @param noteId 便签ID + * @return 便签内容Uri + */ Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ + // 检查便签ID是否合法 if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); } + // 操作列表 ArrayList operationList = new ArrayList(); ContentProviderOperation.Builder builder = null; + // 维护文本数据 if(mTextDataValues.size() > 0) { mTextDataValues.put(DataColumns.NOTE_ID, noteId); - if (mTextDataId == 0) { + if (mTextDataId == 0) { // 是新创建的数据项,而不是更新数据 + // 设置文本数据的MIME类型 mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + // 使用内容解析器插入文本数据到data表中 Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, mTextDataValues); try { + // 设置文本数据ID为插入data表后返回ID,即新插入的那条记录的ID setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); } catch (NumberFormatException e) { + // 插入数据失败 抛出异常 Log.e(TAG, "Insert new text data fail with noteId" + noteId); + // 清空要更新的文本数据内容 mTextDataValues.clear(); return null; } - } else { + } else { // 更新data表中ID为mTextDataId的记录 builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mTextDataId)); builder.withValues(mTextDataValues); + // 向操作列表中添加一个更新操作 operationList.add(builder.build()); } + // 清空要更新的文本数据内容 mTextDataValues.clear(); } + // 维护电话号码数据 if(mCallDataValues.size() > 0) { + // 插入便签ID到要更新的电话号码数据内容中 mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { + if (mCallDataId == 0) { // 插入新的数据 + // 设置MIME类型 mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + // 使用内容解析器插入电话号码数据到data表中 Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, mCallDataValues); try { + // 设置电话号码数据ID setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); } catch (NumberFormatException e) { + // 插入失败 抛出异常 Log.e(TAG, "Insert new call data fail with noteId" + noteId); + // 清空要更新的电话号码数据内容 mCallDataValues.clear(); return null; } - } else { + } else { // 更新数据 builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mCallDataId)); builder.withValues(mCallDataValues); operationList.add(builder.build()); } + // 清空要更新的电话号码数据内容 mCallDataValues.clear(); } if (operationList.size() > 0) { try { + // 批量处理操作 ContentProviderResult[] results = context.getContentResolver().applyBatch( Notes.AUTHORITY, operationList); return (results == null || results.length == 0 || results[0] == null) ? null @@ -249,6 +353,7 @@ public class Note { Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); return null; } catch (OperationApplicationException e) { + // 操作异常 Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); return null; }