From 6fe943bf1a567c055e012c11dea2a2214547885f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C1=E2=80=9D?= <“2701956759@qq.com”> Date: Sun, 18 Jun 2023 10:48:56 +0800 Subject: [PATCH 1/3] Last --- other/06_组长名_贡献度.xls | Bin 0 -> 26112 bytes ...t => 07_220340119刘俊杰_代码标注.txt} | 0 ...8_220340119刘俊杰_实践报告总结.docx | Bin 0 -> 16325 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 other/06_组长名_贡献度.xls rename other/{07_刘俊杰_代码标注.txt => 07_220340119刘俊杰_代码标注.txt} (100%) create mode 100644 other/08_220340119刘俊杰_实践报告总结.docx diff --git a/other/06_组长名_贡献度.xls b/other/06_组长名_贡献度.xls new file mode 100644 index 0000000000000000000000000000000000000000..388e9a5ca764877c8c7631a8ce5174bd1716ee96 GIT binary patch literal 26112 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 literal 0 HcmV?d00001 diff --git a/other/07_刘俊杰_代码标注.txt b/other/07_220340119刘俊杰_代码标注.txt similarity index 100% rename from other/07_刘俊杰_代码标注.txt rename to other/07_220340119刘俊杰_代码标注.txt diff --git a/other/08_220340119刘俊杰_实践报告总结.docx b/other/08_220340119刘俊杰_实践报告总结.docx new file mode 100644 index 0000000000000000000000000000000000000000..17ee179dfe512e9688493e124434073ed3ce7620 GIT binary patch literal 16325 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 literal 0 HcmV?d00001 From 3cf14a1e3d8629cd7dbf55925c0e764e15acc530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C1=E2=80=9D?= <“2701956759@qq.com”> Date: Sun, 18 Jun 2023 10:49:58 +0800 Subject: [PATCH 2/3] Last --- other/220320014-王玉洁-代码注释.txt | 877 ------------------ ...20320014-王玉洁-实践总结报告.docx | Bin 12487 -> 0 bytes 2 files changed, 877 deletions(-) delete mode 100644 other/220320014-王玉洁-代码注释.txt delete mode 100644 other/220320014-王玉洁-实践总结报告.docx diff --git a/other/220320014-王玉洁-代码注释.txt b/other/220320014-王玉洁-代码注释.txt deleted file mode 100644 index 8b6050e..0000000 --- a/other/220320014-王玉洁-代码注释.txt +++ /dev/null @@ -1,877 +0,0 @@ -1、Note.java - -package net.micode.notes.model; - -import android.content.ContentProviderOperation;//批量的更新、插入、删除数据。 -import android.content.ContentProviderResult;//操作的结果 -import android.content.ContentUris;//用于添加和获取Uri后面的ID -import android.content.ContentValues;//一种用来存储基本数据类型数据的存储机制 -import android.content.Context;//需要用该类来弄清楚调用者的实例 -import android.content.OperationApplicationException;//操作应用程序容错 -import android.net.Uri;//表示待操作的数据 -import android.os.RemoteException;//远程容错 -import android.util.Log;//输出日志,比如说出错、警告等 - -public class Note { - // private ContentValues mNoteDiffValues; - ContentValues mNoteDiffValues;// - private NoteData mNoteData; - private static final String TAG = "Note"; - - /** - * Create a new note id for adding a new note to databases - */ - public static synchronized long getNewNoteId(Context context, long folderId) { - // Create a new note in the database - ContentValues values = new ContentValues(); - long createdTime = System.currentTimeMillis(); - values.put(NoteColumns.CREATED_DATE, createdTime); - values.put(NoteColumns.MODIFIED_DATE, createdTime); - values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - values.put(NoteColumns.PARENT_ID, folderId);//将数据写入数据库表格 - Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); - //ContentResolver()主要是实现外部应用对ContentProvider中的数据 - //进行添加、删除、修改和查询操作 - long noteId = 0; - try { - noteId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - noteId = 0; - }//try-catch异常处理 - if (noteId == -1) { - throw new IllegalStateException("Wrong note id:" + noteId); - } - return noteId; - } - - public Note() { - mNoteDiffValues = new ContentValues(); - mNoteData = new NoteData(); - }//定义两个变量用来存储便签的数据,一个是存储便签属性、一个是存储便签内容 - - public void setNoteValue(String key, String value) { - mNoteDiffValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - }//设置数据库表格的标签属性数据 - - public void setTextData(String key, String value) { - mNoteData.setTextData(key, value); - }//设置数据库表格的标签文本内容的数据 - - public void setTextDataId(long id) { - mNoteData.setTextDataId(id); - }//设置文本数据的ID - - public long getTextDataId() { - return mNoteData.mTextDataId; - }//得到文本数据的ID - - public void setCallDataId(long id) { - mNoteData.setCallDataId(id); - }//设置电话号码数据的ID - - public void setCallData(String key, String value) { - mNoteData.setCallData(key, value); - }//得到电话号码数据的ID - - public boolean isLocalModified() { - return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - }//判断是否是本地修改 - - public boolean syncNote(Context context, long noteId) { - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - if (!isLocalModified()) { - return true; - } - - /** - * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and - * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info - */ - 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 {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据 - private long mTextDataId; - - private ContentValues mTextDataValues;//文本数据 - - private long mCallDataId; - - private ContentValues mCallDataValues;//电话号码数据 - - private static final String TAG = "NoteData"; - - public NoteData() { - mTextDataValues = new ContentValues(); - mCallDataValues = new ContentValues(); - mTextDataId = 0; - mCallDataId = 0; - } - //下面是上述几个函数的具体实现 - boolean isLocalModified() { - return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; - } - - void setTextDataId(long id) { - if(id <= 0) { - throw new IllegalArgumentException("Text data id should larger than 0"); - } - mTextDataId = id; - } - - void setCallDataId(long id) { - if (id <= 0) { - throw new IllegalArgumentException("Call data id should larger than 0"); - } - mCallDataId = id; - } - - void setCallData(String key, String value) { - mCallDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - void setTextData(String key, String value) { - mTextDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - //下面函数的作用是将新的数据通过Uri的操作存储到数据库 - Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ - 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) { - mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); - try { - 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 { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mTextDataId)); - builder.withValues(mTextDataValues); - operationList.add(builder.build()); - } - mTextDataValues.clear(); - }//把文本数据存入DataColumns - - if(mCallDataValues.size() > 0) { - mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { - mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mCallDataValues); - try { - 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 { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mCallDataId)); - builder.withValues(mCallDataValues); - operationList.add(builder.build()); - } - mCallDataValues.clear(); - }//把电话号码数据存入DataColumns - - if (operationList.size() > 0) { - try { - ContentProviderResult[] results = context.getContentResolver().applyBatch( - Notes.AUTHORITY, operationList); - return (results == null || results.length == 0 || results[0] == null) ? null - : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); - } catch (RemoteException e) { - 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; - } - }//存储过程中的异常处理 - return null; - } - } -} - -2、WorkingNote.java - -package net.micode.notes.model; - -public class WorkingNote { - // Note for the working note - private Note mNote; - // Note Id - private long mNoteId; - // Note content - private String mContent; - // Note mode - private int mMode; - - private long mAlertDate; - private long mModifiedDate; - private int mBgColorId; - private int mWidgetId; - private int mWidgetType; - private long mFolderId; - private Context mContext; - - private static final String TAG = "WorkingNote"; - - private boolean mIsDeleted; - - private NoteSettingChangedListener mNoteSettingStatusListener; - - // 声明 DATA_PROJECTION字符串数组 - public static final String[] DATA_PROJECTION = new String[] { - DataColumns.ID, - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - // 声明 NOTE_PROJECTION字符串数组 - public static final String[] NOTE_PROJECTION = new String[] { - NoteColumns.PARENT_ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - NoteColumns.MODIFIED_DATE - }; - - private static final int DATA_ID_COLUMN = 0; - private static final int DATA_CONTENT_COLUMN = 1; - private static final int DATA_MIME_TYPE_COLUMN = 2; - private static final int DATA_MODE_COLUMN = 3; - private static final int NOTE_PARENT_ID_COLUMN = 0; - private static final int NOTE_ALERTED_DATE_COLUMN = 1; - private static final int NOTE_BG_COLOR_ID_COLUMN = 2; - private static final int NOTE_WIDGET_ID_COLUMN = 3; - private static final int NOTE_WIDGET_TYPE_COLUMN = 4; - private static final int NOTE_MODIFIED_DATE_COLUMN = 5; - - // New note construct - public WorkingNote(Context context, long folderId) { - mContext = context; - mAlertDate = 0; - mModifiedDate = System.currentTimeMillis(); - mFolderId = folderId; - mNote = new Note(); - mNoteId = 0; - mIsDeleted = false; - mMode = 0; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - } - - // WorkingNote的构造函数 - // Existing note construct - private WorkingNote(Context context, long noteId, long folderId) { - mContext = context; - mNoteId = noteId; - mFolderId = folderId; - mIsDeleted = false; - mNote = new Note(); - loadNote(); - } - - // 加载Note - // 通过数据库调用query函数找到第一个条目 - private void loadNote() { - Cursor cursor = mContext.getContentResolver().query( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, - null, null); - - // 若存在,储存相应信息 - if (cursor != null) { - if (cursor.moveToFirst()) { - mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); - mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); - mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); - mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); - mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); - } - cursor.close(); - // 若不存在,报错 - } else { - Log.e(TAG, "No note with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note with id " + mNoteId); - } - loadNoteData(); - } - - // 加载NoteData - private void loadNoteData() { - Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, - DataColumns.NOTE_ID + "=?", new String[] { - String.valueOf(mNoteId) - }, null); - - if (cursor != null) { - // 查到信息不为空 - if (cursor.moveToFirst()) { // 查看第一项是否存在 - do { - String type = cursor.getString(DATA_MIME_TYPE_COLUMN); - if (DataConstants.NOTE.equals(type)) { - mContent = cursor.getString(DATA_CONTENT_COLUMN); - mMode = cursor.getInt(DATA_MODE_COLUMN); - mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); - } else if (DataConstants.CALL_NOTE.equals(type)) { - mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); - } else { - Log.d(TAG, "Wrong note type with type:" + type); - } - } while (cursor.moveToNext());//查阅所有项,直到为空 - } - cursor.close(); - } else { - Log.e(TAG, "No data with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); - } - } - - // 创建空的Note - // 传参:context,文件夹id,widget,背景颜色 - public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, - int widgetType, int defaultBgColorId) { - WorkingNote note = new WorkingNote(context, folderId); - // 设定相关属性 - note.setBgColorId(defaultBgColorId); - note.setWidgetId(widgetId); - note.setWidgetType(widgetType); - return note; - } - - public static WorkingNote load(Context context, long id) { - return new WorkingNote(context, id, 0); - } - - // 保存Note - public synchronized boolean saveNote() { - if (isWorthSaving()) { //是否值得保存 - if (!existInDatabase()) { // 是否存在数据库中 - if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { - Log.e(TAG, "Create new note fail with id:" + mNoteId); - return false; - } - } - - mNote.syncNote(mContext, mNoteId); - - /** - * Update widget content if there exist any widget of this note - */ - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE - && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - return true; - } else { - return false; - } - } - - // 是否在数据库中存在 - public boolean existInDatabase() { - return mNoteId > 0; - } - - // 是否值得保存 - private boolean isWorthSaving() { - // 被删除,或(不在数据库中 内容为空),或 本地已保存过 - if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) - || (existInDatabase() && !mNote.isLocalModified())) { - return false; - } else { - return true; - } - } - - - // 设置mNoteSettingStatusListener - public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { - mNoteSettingStatusListener = l; - } - - // 设置AlertDate - // 若 mAlertDate与data不同,则更改mAlertDate并设定NoteValue - public void setAlertDate(long date, boolean set) { - if (date != mAlertDate) { - mAlertDate = date; - mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); - } - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onClockAlertChanged(date, set); - } - } - - // 设定删除标记 - public void markDeleted(boolean mark) { - // 设定标记 - mIsDeleted = mark; - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - // 调用mNoteSettingStatusListener的 onWidgetChanged方法 - } - } - - // 设定背景颜色 - public void setBgColorId(int id) { - if (id != mBgColorId) { //设定条件 id != mBgColorId - mBgColorId = id; - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onBackgroundColorChanged(); - } - mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); - } - } - - // 设定检查列表模式 - // 参数:mode - public void setCheckListMode(int mode) { - if (mMode != mode) { //设定条件 mMode != mode - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); - } - mMode = mode; - mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); - } - } - - - // 设定WidgetType - // 参数:type - public void setWidgetType(int type) { - if (type != mWidgetType) {//设定条件 type != mWidgetType - mWidgetType = type; - mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); - // 调用Note的setNoteValue方法更改WidgetType - } - } - - // 设定WidgetId - // 参数:id - public void setWidgetId(int id) { - if (id != mWidgetId) {//设定条件 id != mWidgetId - mWidgetId = id; - mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); - // 调用Note的setNoteValue方法更改WidgetId - } - } - - // 设定WorkingTex - // 参数:更改的text - public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) {//设定条件 mContent, text内容不同 - mContent = text; - mNote.setTextData(DataColumns.CONTENT, mContent); - // 调用Note的setTextData方法更改WorkingText - } - } - - // 转变mNote的CallData及CallNote信息 - // 参数:String phoneNumber, long callDate - public void convertToCallNote(String phoneNumber, long callDate) { - mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); - mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); - mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); - } - - // 判断是否有时钟题型 - public boolean hasClockAlert() { - return (mAlertDate > 0 ? true : false); - } - - // 获取Content - public String getContent() { - return mContent; - } - - // 获取AlertDate - public long getAlertDate() { - return mAlertDate; - } - - // 获取ModifiedDate - public long getModifiedDate() { - return mModifiedDate; - } - - // 获取背景颜色来源id - public int getBgColorResId() { - return NoteBgResources.getNoteBgResource(mBgColorId); - } - - // 获取背景颜色id - public int getBgColorId() { - return mBgColorId; - } - - // 获取标题背景颜色id - public int getTitleBgResId() { - return NoteBgResources.getNoteTitleBgResource(mBgColorId); - } - - // 获取CheckListMode - public int getCheckListMode() { - return mMode; - } - - // 获取便签id - public long getNoteId() { - return mNoteId; - } - - // 获取文件夹id - public long getFolderId() { - return mFolderId; - } - - // 获取WidgetId - public int getWidgetId() { - return mWidgetId; - } - - // 获取WidgetType - public int getWidgetType() { - return mWidgetType; - } - - // 创建接口 NoteSettingChangedListener,便签更新监视 - // 为NoteEditActivity提供接口 - // 提供函数有 - public interface NoteSettingChangedListener { - /** - * Called when the background color of current note has just changed - */ - void onBackgroundColorChanged(); - - /** - * Called when user set clock - */ - void onClockAlertChanged(long date, boolean set); - - /** - * Call when user create note from widget - */ - void onWidgetChanged(); - - /** - * Call when switch between check list mode and normal mode - * @param oldMode is previous mode before change - * @param newMode is new mode - */ - void onCheckListModeChanged(int oldMode, int newMode); - } -} - -3、DataUtils.java -package net.micode.notes.tool; - -public class DataUtils { - public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { //直接删除多个笔记 - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - if (ids.size() == 0) { - Log.d(TAG, "no id is in the hashset"); - return true; - } - - ArrayList operationList = new ArrayList(); //提供一个任务列表 - for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Don't delete system folder root"); - continue; - } //如果发现是根文件夹,则不删除 - ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //用newDelete实现删除功能 - operationList.add(builder.build()); // - } - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 - //数据库事务,数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行 - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.PARENT_ID, desFolderId); - values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); //对需要移动的便签进行数据更新,然后用update实现 - } - - public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //通过withAppendedId方法,为该Uri加上ID - builder.withValue(NoteColumns.PARENT_ID, folderId); - builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); - operationList.add(builder.build()); - }//将ids里包含的每一列的数据逐次加入到operationList中,等待最后的批量处理 - - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch一次性处理一个操作列表 - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} - */ - public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { "COUNT(*)" }, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); //筛选条件:源文件不为trash folder - - int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { - try { - count = cursor.getInt(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "get folder count failed:" + e.toString()); - } finally { - cursor.close(); - } - } - } - return count; - } - - public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), //通过withAppendedId方法,为该Uri加上ID - null, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, - null); //查询条件:type符合,且不属于垃圾文件夹 - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) {//用getcount函数判断cursor是否为空 - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, - NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); - //通过名字查询文件是否存在 - boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { - Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, - NoteColumns.PARENT_ID + "=?", - new String[] { String.valueOf(folderId) }, - null); //查询条件:父ID是传入的folderId; - - HashSet set = null; - if (c != null) { - if (c.moveToFirst()) { - set = new HashSet(); - do { - try { - AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); //0对应的NoteColumns.WIDGET_ID - widget.widgetType = c.getInt(1); //1对应的NoteColumns.WIDGET_TYPE - set.add(widget); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, e.toString()); - } - } while (c.moveToNext()); //查询下一条 - } - c.close(); - } - return set; - } - - public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, - CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, - null); - - if (cursor != null && cursor.moveToFirst()) { - try { - return cursor.getString(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); - } finally { - cursor.close(); - } - } - return ""; - } - - public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, - CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, - null); - //通过数据库操作,查询条件是(callDate和phoneNumber匹配传入参数的值) - - if (cursor != null) { - if (cursor.moveToFirst()) { - try { - return cursor.getLong(0); //0对应的CallNote.NOTE_ID - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call note id fails " + e.toString()); - } - } - cursor.close(); - } - return 0; - } - - public static String getSnippetById(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, - NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, - null);//查询条件:noteId - - if (cursor != null) { - String snippet = ""; - if (cursor.moveToFirst()) { - snippet = cursor.getString(0); - } - cursor.close(); - return snippet; - } - throw new IllegalArgumentException("Note is not found with id: " + noteId); - } - public static String getFormattedSnippet(String snippet) { //对字符串进行格式处理,将字符串两头的空格去掉,同时将换行符去掉 - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); - if (index != -1) { - snippet = snippet.substring(0, index); - } - } - return snippet; - } - -} - diff --git a/other/220320014-王玉洁-实践总结报告.docx b/other/220320014-王玉洁-实践总结报告.docx deleted file mode 100644 index 0410c2265c0e15364d14efd039531da3ab6f8d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12487 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 Qefj0V_{;UQLH`Q+Kb(Lih5!Hn From 458b3339c8722dfe990e42a54f1a80e4abe6c8df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C1=E2=80=9D?= <“2701956759@qq.com”> Date: Sun, 18 Jun 2023 10:50:12 +0800 Subject: [PATCH 3/3] Last --- other/07_220320014-王玉洁-代码注释.txt | 877 ++++++++++++++++++ ...20320014-王玉洁-实践总结报告.docx | Bin 0 -> 12487 bytes 2 files changed, 877 insertions(+) create mode 100644 other/07_220320014-王玉洁-代码注释.txt create mode 100644 other/08_220320014-王玉洁-实践总结报告.docx diff --git a/other/07_220320014-王玉洁-代码注释.txt b/other/07_220320014-王玉洁-代码注释.txt new file mode 100644 index 0000000..8b6050e --- /dev/null +++ b/other/07_220320014-王玉洁-代码注释.txt @@ -0,0 +1,877 @@ +1、Note.java + +package net.micode.notes.model; + +import android.content.ContentProviderOperation;//批量的更新、插入、删除数据。 +import android.content.ContentProviderResult;//操作的结果 +import android.content.ContentUris;//用于添加和获取Uri后面的ID +import android.content.ContentValues;//一种用来存储基本数据类型数据的存储机制 +import android.content.Context;//需要用该类来弄清楚调用者的实例 +import android.content.OperationApplicationException;//操作应用程序容错 +import android.net.Uri;//表示待操作的数据 +import android.os.RemoteException;//远程容错 +import android.util.Log;//输出日志,比如说出错、警告等 + +public class Note { + // private ContentValues mNoteDiffValues; + ContentValues mNoteDiffValues;// + private NoteData mNoteData; + private static final String TAG = "Note"; + + /** + * Create a new note id for adding a new note to databases + */ + public static synchronized long getNewNoteId(Context context, long folderId) { + // Create a new note in the database + ContentValues values = new ContentValues(); + long createdTime = System.currentTimeMillis(); + values.put(NoteColumns.CREATED_DATE, createdTime); + values.put(NoteColumns.MODIFIED_DATE, createdTime); + values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + values.put(NoteColumns.PARENT_ID, folderId);//将数据写入数据库表格 + Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + //ContentResolver()主要是实现外部应用对ContentProvider中的数据 + //进行添加、删除、修改和查询操作 + long noteId = 0; + try { + noteId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + noteId = 0; + }//try-catch异常处理 + if (noteId == -1) { + throw new IllegalStateException("Wrong note id:" + noteId); + } + return noteId; + } + + public Note() { + mNoteDiffValues = new ContentValues(); + mNoteData = new NoteData(); + }//定义两个变量用来存储便签的数据,一个是存储便签属性、一个是存储便签内容 + + public void setNoteValue(String key, String value) { + mNoteDiffValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + }//设置数据库表格的标签属性数据 + + public void setTextData(String key, String value) { + mNoteData.setTextData(key, value); + }//设置数据库表格的标签文本内容的数据 + + public void setTextDataId(long id) { + mNoteData.setTextDataId(id); + }//设置文本数据的ID + + public long getTextDataId() { + return mNoteData.mTextDataId; + }//得到文本数据的ID + + public void setCallDataId(long id) { + mNoteData.setCallDataId(id); + }//设置电话号码数据的ID + + public void setCallData(String key, String value) { + mNoteData.setCallData(key, value); + }//得到电话号码数据的ID + + public boolean isLocalModified() { + return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); + }//判断是否是本地修改 + + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + if (!isLocalModified()) { + return true; + } + + /** + * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and + * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the + * note data info + */ + 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 {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据 + private long mTextDataId; + + private ContentValues mTextDataValues;//文本数据 + + private long mCallDataId; + + private ContentValues mCallDataValues;//电话号码数据 + + private static final String TAG = "NoteData"; + + public NoteData() { + mTextDataValues = new ContentValues(); + mCallDataValues = new ContentValues(); + mTextDataId = 0; + mCallDataId = 0; + } + //下面是上述几个函数的具体实现 + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("Text data id should larger than 0"); + } + mTextDataId = id; + } + + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("Call data id should larger than 0"); + } + mCallDataId = id; + } + + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + //下面函数的作用是将新的数据通过Uri的操作存储到数据库 + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * Check for safety + */ + 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) { + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + 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 { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); + }//把文本数据存入DataColumns + + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); + if (mCallDataId == 0) { + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + 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 { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); + }//把电话号码数据存入DataColumns + + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + 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; + } + }//存储过程中的异常处理 + return null; + } + } +} + +2、WorkingNote.java + +package net.micode.notes.model; + +public class WorkingNote { + // Note for the working note + private Note mNote; + // Note Id + private long mNoteId; + // Note content + private String mContent; + // Note mode + private int mMode; + + private long mAlertDate; + private long mModifiedDate; + private int mBgColorId; + private int mWidgetId; + private int mWidgetType; + private long mFolderId; + private Context mContext; + + private static final String TAG = "WorkingNote"; + + private boolean mIsDeleted; + + private NoteSettingChangedListener mNoteSettingStatusListener; + + // 声明 DATA_PROJECTION字符串数组 + public static final String[] DATA_PROJECTION = new String[] { + DataColumns.ID, + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + // 声明 NOTE_PROJECTION字符串数组 + public static final String[] NOTE_PROJECTION = new String[] { + NoteColumns.PARENT_ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + NoteColumns.MODIFIED_DATE + }; + + private static final int DATA_ID_COLUMN = 0; + private static final int DATA_CONTENT_COLUMN = 1; + private static final int DATA_MIME_TYPE_COLUMN = 2; + private static final int DATA_MODE_COLUMN = 3; + private static final int NOTE_PARENT_ID_COLUMN = 0; + private static final int NOTE_ALERTED_DATE_COLUMN = 1; + private static final int NOTE_BG_COLOR_ID_COLUMN = 2; + private static final int NOTE_WIDGET_ID_COLUMN = 3; + private static final int NOTE_WIDGET_TYPE_COLUMN = 4; + private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + + // New note construct + public WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; + mModifiedDate = System.currentTimeMillis(); + mFolderId = folderId; + mNote = new Note(); + mNoteId = 0; + mIsDeleted = false; + mMode = 0; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + } + + // WorkingNote的构造函数 + // Existing note construct + private WorkingNote(Context context, long noteId, long folderId) { + mContext = context; + mNoteId = noteId; + mFolderId = folderId; + mIsDeleted = false; + mNote = new Note(); + loadNote(); + } + + // 加载Note + // 通过数据库调用query函数找到第一个条目 + private void loadNote() { + Cursor cursor = mContext.getContentResolver().query( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, + null, null); + + // 若存在,储存相应信息 + if (cursor != null) { + if (cursor.moveToFirst()) { + mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); + mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); + mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); + mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); + mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + } + cursor.close(); + // 若不存在,报错 + } else { + Log.e(TAG, "No note with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note with id " + mNoteId); + } + loadNoteData(); + } + + // 加载NoteData + private void loadNoteData() { + Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, + DataColumns.NOTE_ID + "=?", new String[] { + String.valueOf(mNoteId) + }, null); + + if (cursor != null) { + // 查到信息不为空 + if (cursor.moveToFirst()) { // 查看第一项是否存在 + do { + String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + if (DataConstants.NOTE.equals(type)) { + mContent = cursor.getString(DATA_CONTENT_COLUMN); + mMode = cursor.getInt(DATA_MODE_COLUMN); + mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); + } else if (DataConstants.CALL_NOTE.equals(type)) { + mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); + } else { + Log.d(TAG, "Wrong note type with type:" + type); + } + } while (cursor.moveToNext());//查阅所有项,直到为空 + } + cursor.close(); + } else { + Log.e(TAG, "No data with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); + } + } + + // 创建空的Note + // 传参:context,文件夹id,widget,背景颜色 + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + // 设定相关属性 + note.setBgColorId(defaultBgColorId); + note.setWidgetId(widgetId); + note.setWidgetType(widgetType); + return note; + } + + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + // 保存Note + public synchronized boolean saveNote() { + if (isWorthSaving()) { //是否值得保存 + if (!existInDatabase()) { // 是否存在数据库中 + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + mNote.syncNote(mContext, mNoteId); + + /** + * Update widget content if there exist any widget of this note + */ + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE + && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + // 是否在数据库中存在 + public boolean existInDatabase() { + return mNoteId > 0; + } + + // 是否值得保存 + private boolean isWorthSaving() { + // 被删除,或(不在数据库中 内容为空),或 本地已保存过 + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; + } else { + return true; + } + } + + + // 设置mNoteSettingStatusListener + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + // 设置AlertDate + // 若 mAlertDate与data不同,则更改mAlertDate并设定NoteValue + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + // 设定删除标记 + public void markDeleted(boolean mark) { + // 设定标记 + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + // 调用mNoteSettingStatusListener的 onWidgetChanged方法 + } + } + + // 设定背景颜色 + public void setBgColorId(int id) { + if (id != mBgColorId) { //设定条件 id != mBgColorId + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + // 设定检查列表模式 + // 参数:mode + public void setCheckListMode(int mode) { + if (mMode != mode) { //设定条件 mMode != mode + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + + // 设定WidgetType + // 参数:type + public void setWidgetType(int type) { + if (type != mWidgetType) {//设定条件 type != mWidgetType + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + // 调用Note的setNoteValue方法更改WidgetType + } + } + + // 设定WidgetId + // 参数:id + public void setWidgetId(int id) { + if (id != mWidgetId) {//设定条件 id != mWidgetId + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + // 调用Note的setNoteValue方法更改WidgetId + } + } + + // 设定WorkingTex + // 参数:更改的text + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) {//设定条件 mContent, text内容不同 + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + // 调用Note的setTextData方法更改WorkingText + } + } + + // 转变mNote的CallData及CallNote信息 + // 参数:String phoneNumber, long callDate + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + // 判断是否有时钟题型 + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + // 获取Content + public String getContent() { + return mContent; + } + + // 获取AlertDate + public long getAlertDate() { + return mAlertDate; + } + + // 获取ModifiedDate + public long getModifiedDate() { + return mModifiedDate; + } + + // 获取背景颜色来源id + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + // 获取背景颜色id + public int getBgColorId() { + return mBgColorId; + } + + // 获取标题背景颜色id + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + // 获取CheckListMode + public int getCheckListMode() { + return mMode; + } + + // 获取便签id + public long getNoteId() { + return mNoteId; + } + + // 获取文件夹id + public long getFolderId() { + return mFolderId; + } + + // 获取WidgetId + public int getWidgetId() { + return mWidgetId; + } + + // 获取WidgetType + public int getWidgetType() { + return mWidgetType; + } + + // 创建接口 NoteSettingChangedListener,便签更新监视 + // 为NoteEditActivity提供接口 + // 提供函数有 + public interface NoteSettingChangedListener { + /** + * Called when the background color of current note has just changed + */ + void onBackgroundColorChanged(); + + /** + * Called when user set clock + */ + void onClockAlertChanged(long date, boolean set); + + /** + * Call when user create note from widget + */ + void onWidgetChanged(); + + /** + * Call when switch between check list mode and normal mode + * @param oldMode is previous mode before change + * @param newMode is new mode + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} + +3、DataUtils.java +package net.micode.notes.tool; + +public class DataUtils { + public static final String TAG = "DataUtils"; + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { //直接删除多个笔记 + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + if (ids.size() == 0) { + Log.d(TAG, "no id is in the hashset"); + return true; + } + + ArrayList operationList = new ArrayList(); //提供一个任务列表 + for (long id : ids) { + if(id == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Don't delete system folder root"); + continue; + } //如果发现是根文件夹,则不删除 + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //用newDelete实现删除功能 + operationList.add(builder.build()); // + } + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 + //数据库事务,数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行 + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); //对需要移动的便签进行数据更新,然后用update实现 + } + + public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, + long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //通过withAppendedId方法,为该Uri加上ID + builder.withValue(NoteColumns.PARENT_ID, folderId); + builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); + operationList.add(builder.build()); + }//将ids里包含的每一列的数据逐次加入到operationList中,等待最后的批量处理 + + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch一次性处理一个操作列表 + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + /** + * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + */ + public static int getUserFolderCount(ContentResolver resolver) { + Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { "COUNT(*)" }, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, + null); //筛选条件:源文件不为trash folder + + int count = 0; + if(cursor != null) { + if(cursor.moveToFirst()) { + try { + count = cursor.getInt(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "get folder count failed:" + e.toString()); + } finally { + cursor.close(); + } + } + } + return count; + } + + public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), //通过withAppendedId方法,为该Uri加上ID + null, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, + new String [] {String.valueOf(type)}, + null); //查询条件:type符合,且不属于垃圾文件夹 + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) {//用getcount函数判断cursor是否为空 + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", + new String[] { name }, null); + //通过名字查询文件是否存在 + boolean exist = false; + if(cursor != null) { + if(cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + NoteColumns.PARENT_ID + "=?", + new String[] { String.valueOf(folderId) }, + null); //查询条件:父ID是传入的folderId; + + HashSet set = null; + if (c != null) { + if (c.moveToFirst()) { + set = new HashSet(); + do { + try { + AppWidgetAttribute widget = new AppWidgetAttribute(); + widget.widgetId = c.getInt(0); //0对应的NoteColumns.WIDGET_ID + widget.widgetType = c.getInt(1); //1对应的NoteColumns.WIDGET_TYPE + set.add(widget); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, e.toString()); + } + } while (c.moveToNext()); //查询下一条 + } + c.close(); + } + return set; + } + + public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", + new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + null); + + if (cursor != null && cursor.moveToFirst()) { + try { + return cursor.getString(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call number fails " + e.toString()); + } finally { + cursor.close(); + } + } + return ""; + } + + public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.NOTE_ID }, + CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" + + CallNote.PHONE_NUMBER + ",?)", + new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, + null); + //通过数据库操作,查询条件是(callDate和phoneNumber匹配传入参数的值) + + if (cursor != null) { + if (cursor.moveToFirst()) { + try { + return cursor.getLong(0); //0对应的CallNote.NOTE_ID + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call note id fails " + e.toString()); + } + } + cursor.close(); + } + return 0; + } + + public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + NoteColumns.ID + "=?", + new String [] { String.valueOf(noteId)}, + null);//查询条件:noteId + + if (cursor != null) { + String snippet = ""; + if (cursor.moveToFirst()) { + snippet = cursor.getString(0); + } + cursor.close(); + return snippet; + } + throw new IllegalArgumentException("Note is not found with id: " + noteId); + } + public static String getFormattedSnippet(String snippet) { //对字符串进行格式处理,将字符串两头的空格去掉,同时将换行符去掉 + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); + } + } + return snippet; + } + +} + diff --git a/other/08_220320014-王玉洁-实践总结报告.docx b/other/08_220320014-王玉洁-实践总结报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..0410c2265c0e15364d14efd039531da3ab6f8d00 GIT binary patch literal 12487 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 Qefj0V_{;UQLH`Q+Kb(Lih5!Hn literal 0 HcmV?d00001