Signed-off-by: “xxx” <651952673@qq.com>

pull/41/head
“xxx” 2 years ago
parent b86fb4885c
commit bf30bb8593

@ -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<String> 对象,其中包含了 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);//如果有文本数据,首先将笔记的 IDnoteId存储到 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);//如果有电话号码数据,首先将笔记的 IDnoteId存储到 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);

@ -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);

@ -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 { //如果这些文件不存在,则新建

Loading…
Cancel
Save