diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index fad963f..cc5d225 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -11,9 +11,8 @@
-
-
-
+
+
@@ -35,47 +34,38 @@
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -83,29 +73,17 @@
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -113,17 +91,26 @@
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -135,6 +122,7 @@
JSONObject
exportToText
equal
+ notesCursor.moveToFirst()
@@ -155,15 +143,16 @@
-
-
+
+
+
-
+
@@ -195,7 +184,6 @@
-
@@ -226,44 +214,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -318,6 +268,7 @@
+
@@ -423,15 +374,22 @@
1569866572075
-
+
+ 1570536169255
+
+
+
+ 1570536169255
+
+
-
+
-
+
@@ -442,8 +400,8 @@
-
-
+
+
@@ -459,6 +417,28 @@
+
+
+
+
+ jar://G:/Android/Sdk/platforms/android-28/android.jar!/android/database/AbstractCursor.class
+ 39
+
+
+
+
+
+
+ jar://G:/Android/Sdk/platforms/android-28/android.jar!/android/database/AbstractCursor.class
+ 41
+
+
+
+
+
+
+
+
@@ -520,13 +500,6 @@
-
-
-
-
-
-
-
@@ -534,13 +507,6 @@
-
-
-
-
-
-
-
@@ -555,31 +521,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -598,13 +539,6 @@
-
-
-
-
-
-
-
@@ -633,13 +567,6 @@
-
-
-
-
-
-
-
@@ -647,61 +574,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -717,45 +596,100 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -769,17 +703,109 @@
-
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/net/micode/notes/tool/BackupUtils.java b/app/src/main/java/net/micode/notes/tool/BackupUtils.java
index 7c507a3..a25a488 100644
--- a/app/src/main/java/net/micode/notes/tool/BackupUtils.java
+++ b/app/src/main/java/net/micode/notes/tool/BackupUtils.java
@@ -42,7 +42,7 @@ public class BackupUtils {
private static final String TAG = "BackupUtils";
// Singleton stuff
private static BackupUtils sInstance;
-
+ //获得实例
public static synchronized BackupUtils getInstance(Context context) {
if (sInstance == null) {
sInstance = new BackupUtils(context);
@@ -79,7 +79,7 @@ public class BackupUtils {
其中.equals表示的是二者的内容是否相等*/
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
-
+ //导出文本
public int exportToText() {
return mTextExport.exportToText();
}
@@ -99,13 +99,13 @@ public class BackupUtils {
NoteColumns.SNIPPET,
NoteColumns.TYPE
};
-
+ //便签列id
private static final int NOTE_COLUMN_ID = 0;
-
+ //便签修改的日期
private static final int NOTE_COLUMN_MODIFIED_DATE = 1;
-
+ //便签列片段
private static final int NOTE_COLUMN_SNIPPET = 2;
-
+ //数据项
private static final String[] DATA_PROJECTION = {
DataColumns.CONTENT,
DataColumns.MIME_TYPE,
@@ -114,15 +114,15 @@ public class BackupUtils {
DataColumns.DATA3,
DataColumns.DATA4,
};
-
+ //数据列中内容
private static final int DATA_COLUMN_CONTENT = 0;
-
+ //数据列中mime类型
private static final int DATA_COLUMN_MIME_TYPE = 1;
-
+ //数据中拨打日期
private static final int DATA_COLUMN_CALL_DATE = 2;
-
+ //数据列中的电话号码
private static final int DATA_COLUMN_PHONE_NUMBER = 4;
-
+ //文本格式
private final String [] TEXT_FORMAT;
private static final int FORMAT_FOLDER_NAME = 0;
private static final int FORMAT_NOTE_DATE = 1;
@@ -154,6 +154,11 @@ public class BackupUtils {
}, null);
//下面有很多地方调用了android.database.Cursor类有一些固定用法
if (notesCursor != null) {
+ /*
+ 查询出来的cursor的初始位置是指向第一条记录的前一个位置的
+ cursor.moveToFirst()指向查询结果的第一个位置。
+ 一般通过判断cursor.moveToFirst()的值为true或false来确定查询结果是否为空。
+ */
if (notesCursor.moveToFirst()) {
do {
// Print note's last modified date
@@ -181,6 +186,7 @@ public class BackupUtils {
if (dataCursor != null) {
if (dataCursor.moveToFirst()) {
do {
+ //获取mimeType
String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE);
if (DataConstants.CALL_NOTE.equals(mimeType)) {
// Print phone number
@@ -210,6 +216,7 @@ public class BackupUtils {
}
} while (dataCursor.moveToNext());
}
+ //及时关闭cursor
dataCursor.close();
}
// print a line separator between note
@@ -233,6 +240,7 @@ public class BackupUtils {
}
//定义输出流ps
PrintStream ps = getExportToTextPrintStream();
+ //检查null
if (ps == null) {
Log.e(TAG, "get print stream error");
return STATE_SYSTEM_ERROR;
@@ -250,18 +258,22 @@ public class BackupUtils {
do {
// Print folder's name
String folderName = "";
+ //若id为最近记录里调用的文件中
if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) {
folderName = mContext.getString(R.string.call_record_folder_name);
} else {
folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET);
}
+ //若文本工具为空
if (!TextUtils.isEmpty(folderName)) {
ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName));
}
+ //获得文件id
String folderId = folderCursor.getString(NOTE_COLUMN_ID);
exportFolderToText(folderId, ps);
} while (folderCursor.moveToNext());
}
+ //及时关闭folderCursor
folderCursor.close();
}
diff --git a/app/src/main/java/net/micode/notes/tool/DataUtils.java b/app/src/main/java/net/micode/notes/tool/DataUtils.java
index 074cbf0..f723fbe 100644
--- a/app/src/main/java/net/micode/notes/tool/DataUtils.java
+++ b/app/src/main/java/net/micode/notes/tool/DataUtils.java
@@ -41,10 +41,12 @@ public class DataUtils {
public static final String TAG = "DataUtils";
//批处理删除便签
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) {
+ //id不存在
if (ids == null) {
Log.d(TAG, "the ids is null");
return true;
}
+ //id在哈希表里
if (ids.size() == 0) {
Log.d(TAG, "no id is in the hashset");
return true;
@@ -70,6 +72,7 @@ public class DataUtils {
return false;
}
return true;
+ //捕捉远程异常
} catch (RemoteException e) {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
} catch (OperationApplicationException e) {
@@ -121,6 +124,12 @@ public class DataUtils {
* Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}}
*/
public static int getUserFolderCount(ContentResolver resolver) {
+ /*
+ ContentResolver直译为内容解析器,
+ Android中程序间数据的共享是通过Provider/Resolver进行的。
+ 提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。
+ 在这里,系统提供了联系人的Provider,那么我们就需要构建一个Resolver来读取联系人的内容。
+ */
Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI,
new String[] { "COUNT(*)" },
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?",
@@ -239,6 +248,7 @@ public class DataUtils {
null);
if (cursor != null && cursor.moveToFirst()) {
+ //获得第一行数据
try {
return cursor.getString(0);
} catch (IndexOutOfBoundsException e) {
@@ -249,7 +259,7 @@ public class DataUtils {
}
return "";
}
- //通过电话号码和日期获得便签ID
+ //通过电话号码和拨打日期获得便签ID
public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
new String [] { CallNote.NOTE_ID },
@@ -262,6 +272,7 @@ public class DataUtils {
if (cursor.moveToFirst()) {
try {
return cursor.getLong(0);
+ //记录获取失败
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, "Get call note id fails " + e.toString());
}