diff --git a/src/Notes-master/src/net/micode/notes/model/Note.java b/src/Notes-master/src/net/micode/notes/model/Note.java index 63fcbbf..17f7256 100644 --- a/src/Notes-master/src/net/micode/notes/model/Note.java +++ b/src/Notes-master/src/net/micode/notes/model/Note.java @@ -43,12 +43,12 @@ public class Note { */ 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); + ContentValues values = new ContentValues();//新建values来保存信息 + 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中的数据 @@ -57,6 +57,9 @@ public class Note { long noteId = 0; try { noteId = Long.valueOf(uri.getPathSegments().get(1)); +// uri.getPathSegments().get(1) 的作用是从 Uri 对象中获取路径的分段,并返回索引为 1 的分段内容。 +// 在这段代码中,通过调用 uri.getPathSegments() 方法获取到一个 List 对象,其中包含了 Uri 路径的各个分段内容。而后使用 get(1) 方法获取到索引为 1 的分段内容。 +// 根据代码的上下文,可以推测索引为 1 的分段内容代表新生成的笔记的 ID 号。因此,uri.getPathSegments().get(1) 的作用就是从 Uri 中解析出新生成的笔记的 ID 号,并将其作为一个长整型值返回给变量 noteId。 } catch (NumberFormatException e) { Log.e(TAG, "Get note id error :" + e.toString()); noteId = 0; @@ -64,7 +67,7 @@ public class Note { if (noteId == -1) { throw new IllegalStateException("Wrong note id:" + noteId); } - return noteId; + return noteId;//生成的新笔记的 ID 号 } public Note() { @@ -72,10 +75,10 @@ public class Note { mNoteData = new NoteData(); }//定义两个变量用来存储便签的数据,一个是存储便签属性、一个是存储便签内容 - public void setNoteValue(String key, String value) { - mNoteDiffValues.put(key, value); + public void setNoteValue(String key, String value) {//接受两个参数:key 和 value,分别表示属性的键和值。 + mNoteDiffValues.put(key, value);//将 key 和 value 存储到 mNoteDiffValues 对象中 mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());//修改时间为当前时间 }//设置数据库表格的标签属性数据 public void setTextData(String key, String value) { @@ -117,12 +120,12 @@ public class Note { * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the * note data info */ - if (context.getContentResolver().update( + if (context.getContentResolver().update(//更新数据库中的笔记数据。 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, - null) == 0) { + null) == 0) {//笔记的 Uri,通过 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId) 获取到特定 ID 的笔记的 Uri。 Log.e(TAG, "Update note error, should not happen"); // Do not return, fall through - } + }//如果更新操作返回的结果为 0(表示没有进行更新操作),则记录错误日志 "Update note error, should not happen",并且在注释中说明不要返回,而是继续执行后面的代码。 mNoteDiffValues.clear(); if (mNoteData.isLocalModified() @@ -194,11 +197,13 @@ public class Note { ContentProviderOperation.Builder builder = null;//数据库的操作列表 if(mTextDataValues.size() > 0) {//有文本数据 - mTextDataValues.put(DataColumns.NOTE_ID, noteId); - if (mTextDataId == 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId);//如果有文本数据,首先将笔记的 ID(noteId)存储到 mTextDataValues 中 + if (mTextDataId == 0) {//如果是 0,表示当前没有对应的文本数据记录,需要进行插入操作。 mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + //在插入操作中,设置 mTextDataValues 的 MIME 类型为 TextNote.CONTENT_ITEM_TYPE,表示文本类型的数据。 Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); + mTextDataValues);//通过 context.getContentResolver().insert() 方法将 mTextDataValues 插入到 DataColumns 表中,并返回插入数据的 Uri。 + //尝试从插入返回的 Uri 中获取新插入数据的 ID,并将其转换为 Long 类型,并存储到 mTextDataId 中。若转换失败,记录错误日志并清空 mTextDataValues,然后返回 null。 try { setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); } catch (NumberFormatException e) { @@ -206,21 +211,25 @@ public class Note { mTextDataValues.clear(); return null; } - } else { + } else {//如果 mTextDataId 不为 0,则表示已存在对应的文本数据记录,需要进行更新操作。 builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mTextDataId)); + Notes.CONTENT_DATA_URI, mTextDataId));//通过 ContentUris.withAppendedId() 获取特定 ID 的文本数据记录的 Uri,并设置更新值为 mTextDataValues。 builder.withValues(mTextDataValues); - operationList.add(builder.build()); + operationList.add(builder.build());//将更新操作添加到 operationList 中。 } - mTextDataValues.clear(); + mTextDataValues.clear();//清空 mTextDataValues。 }//把文本数据存入DataColumns - if(mCallDataValues.size() > 0) {//有电话号码 - mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { + if(mCallDataValues.size() > 0) {//有电话号码。用于将电话号码数据存储到数据库的 DataColumns 表中 + mCallDataValues.put(DataColumns.NOTE_ID, noteId);//如果有电话号码数据,首先将笔记的 ID(noteId)存储到 mCallDataValues 中。 + if (mCallDataId == 0) {//判断 mCallDataId 是否为 0。如果是 0,表示当前没有对应的电话号码数据记录,需要进行插入操作。 mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, mCallDataValues); + //在插入操作中,设置 mCallDataValues 的 MIME 类型为 CallNote.CONTENT_ITEM_TYPE,表示电话号码类型的数据。 + // 然后通过 context.getContentResolver().insert() 方法将 mCallDataValues 插入到 DataColumns 表中,并返回插入数据的 Uri。 + + //尝试从插入返回的 Uri 中获取新插入数据的 ID,并将其转换为 Long 类型,并存储到 mCallDataId 中。若转换失败,记录错误日志并清空 mCallDataValues,然后返回 null。 try { setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); } catch (NumberFormatException e) { @@ -228,16 +237,19 @@ public class Note { mCallDataValues.clear(); return null; } - } else { + } else {//如果 mCallDataId 不为 0,则表示已存在对应的电话号码数据记录,需要进行更新操作。 builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mCallDataId)); + Notes.CONTENT_DATA_URI, mCallDataId));//创建一个 ContentProviderOperation.Builder 对象,通过 ContentUris.withAppendedId() 获取特定 ID 的电话号码数据记录的 Uri,并设置更新值为 mCallDataValues。 builder.withValues(mCallDataValues); - operationList.add(builder.build()); + operationList.add(builder.build());////将更新操作添加到 operationList 中。 } - mCallDataValues.clear(); + mCallDataValues.clear();//清空 mCallDataValues。 }//把电话号码数据存入DataColumns +//将电话号码数据与笔记关联起来,方便后续读取和展示。 + if (operationList.size() > 0) {//总长大于0 +// 在 try-catch 块中,捕获可能发生的 RemoteException 和 OperationApplicationException 异常。 try { ContentProviderResult[] results = context.getContentResolver().applyBatch( Notes.AUTHORITY, operationList); diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index c2c1b9e..7b347da 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -113,13 +113,13 @@ public class WorkingNote { private WorkingNote(Context context, long folderId) { mContext = context; mAlertDate = 0; - mModifiedDate = System.currentTimeMillis(); - mFolderId = folderId; + mModifiedDate = System.currentTimeMillis();//将修改日期设置为当前时间的毫秒数。 + mFolderId = folderId;//将传入的文件夹 ID 赋值给 mFolderId。 mNote = new Note(); mNoteId = 0; mIsDeleted = false; mMode = 0; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE;//:将小部件类型设置为无效类型(Notes.TYPE_WIDGET_INVALIDE)。 } // Existing note construct @@ -140,7 +140,7 @@ public class WorkingNote { 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); diff --git a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java index 5a7c0f4..7062f51 100644 --- a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java @@ -37,16 +37,17 @@ import java.io.PrintStream;//导入 Java 的打印流(PrintStream)类,用于 //备份的处理 public class BackupUtils { - private static final String TAG = "BackupUtils"; + private static final String TAG = "BackupUtils";//定义了一个私有的静态字符串常量 TAG,用于日志输出。 // Singleton stuff - private static BackupUtils sInstance; + private static BackupUtils sInstance;//定义了一个私有的静态成员变量 sInstance,表示单例对象。 public static synchronized BackupUtils getInstance(Context context) { - if (sInstance == null) { + if (sInstance == null) { //如果当前备份不存在,则新声明一个 - sInstance = new BackupUtils(context); + sInstance = new BackupUtils(context);//并将传入的上下文参数赋值给它 + } - return sInstance; + return sInstance;//。最后返回 sInstance。 } /** @@ -63,38 +64,37 @@ public class BackupUtils { public static final int STATE_SYSTEM_ERROR = 3; // Backup or restore success成功存储 public static final int STATE_SUCCESS = 4; - - private TextExport mTextExport; + //备份或恢复成功。 + private TextExport mTextExport;//声明了一个私有成员变量 mTextExport,表示文本导出对象。 //初始化函数 private BackupUtils(Context context) { mTextExport = new TextExport(context); - } + }//用于初始化 BackupUtils 对象 //外部存储功能是否可用 private static boolean externalStorageAvailable() {//外部存储功能是否可用 return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } + }//用于检查外部存储是否可用。它通过比较外部存储的状态是否为 Environment.MEDIA_MOUNTED 来判断外部存储是否可用,并返回布尔值。 // public int exportToText() { return mTextExport.exportToText(); } - +//用于导出数据到文本文件。该方法调用了 mTextExport 对象的 exportToText() 方法,并返回结果。 public String getExportedTextFileName() { return mTextExport.mFileName; } - +// 用于获取导出的文本文件名。该方法返回 mTextExport 对象的 mFileName 属性。 public String getExportedTextFileDir() { return mTextExport.mFileDirectory; } - - private static class TextExport { +// 用于获取导出的文本文件目录。该方法返回 mTextExport 对象的 mFileDirectory 属性。 private static class TextExport { private static final String[] NOTE_PROJECTION = { - NoteColumns.ID, - NoteColumns.MODIFIED_DATE, - NoteColumns.SNIPPET, - NoteColumns.TYPE + NoteColumns.ID,//表示笔记的唯一标识符。 + NoteColumns.MODIFIED_DATE,//表示笔记的修改日期。 + NoteColumns.SNIPPET,//表示笔记的摘要或片段。 + NoteColumns.TYPE//表示笔记的类型。 }; private static final int NOTE_COLUMN_ID = 0; @@ -171,12 +171,16 @@ public class BackupUtils { * Export note identified by id to a print stream */ private void exportNoteToText(String noteId, PrintStream ps) { +// 通过 mContext.getContentResolver().query() 方法查询数据库,获取与指定笔记 ID 相关的数据。 Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { noteId }, null); - if (dataCursor != null) { //利用光标来扫描内容,区别为callnote和note两种,靠ps.printline输出 +// if (dataCursor != null) { //利用光标来扫描内容,区别为callnote和note两种,靠ps.printline输出 +// 如果类型为 DataConstants.CALL_NOTE,则获取电话号码、通话时间、附件位置等信息,并使用 ps.println() 方法输出到文本文件中。 +// 如果类型为 DataConstants.NOTE,则获取笔记内容信息,并使用 ps.println() 方法输出到文本文件中。 +// 在每个笔记结束后,输出一行分隔符(由 Character.LINE_SEPARATOR, Character.LETTER_NUMBER 组成),以便区分不同笔记的内容 if (dataCursor.moveToFirst()) { do { String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); @@ -211,7 +215,7 @@ public class BackupUtils { dataCursor.close(); } // print a line separator between note - try { + try {//如果在输出时发生异常,则会记录日志。 ps.write(new byte[] { Character.LINE_SEPARATOR, Character.LETTER_NUMBER }); @@ -318,14 +322,14 @@ public class BackupUtils { * Generate the text file to store imported data */ private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder();//创建一个 StringBuilder 对象 sb,用于构建文件的路径。 sb.append(Environment.getExternalStorageDirectory()); //外部(SD卡)的存储路径 sb.append(context.getString(filePathResId));//文件的存储路径 File filedir = new File(sb.toString());//filedir应该就是用来存储路径信息 sb.append(context.getString( fileNameFormatResId, DateFormat.format(context.getString(R.string.format_date_ymd), - System.currentTimeMillis()))); + System.currentTimeMillis())));//将资源 ID 为 fileNameFormatResId 的字符串添加到 sb 中,该字符串是文件名的格式化模板,其中使用了当前时间进行格式化。 File file = new File(sb.toString()); try { //如果这些文件不存在,则新建