|
|
|
@ -36,85 +36,148 @@ import java.util.HashSet;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class DataUtils {
|
|
|
|
public class DataUtils {
|
|
|
|
|
|
|
|
// 用于日志记录的标签,方便在日志输出中准确识别该类相关的操作记录,利于调试和问题排查
|
|
|
|
public static final String TAG = "DataUtils";
|
|
|
|
public static final String TAG = "DataUtils";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 批量删除笔记的方法,通过给定的内容解析器(ContentResolver)和要删除的笔记ID集合(HashSet<Long>)来执行删除操作。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,通过它来执行数据库相关操作,如删除、更新等。
|
|
|
|
|
|
|
|
* @param ids 包含要删除笔记的唯一标识符(Long类型)的HashSet集合,如果为null或者集合为空,表示没有要删除的有效笔记,直接返回相应结果。
|
|
|
|
|
|
|
|
* @return 如果删除操作成功(即所有符合条件的笔记都被成功删除),返回true;否则返回false。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
|
|
|
|
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
|
|
|
|
|
|
|
|
// 如果传入的ids集合为null,说明没有指定要删除的笔记ID,在日志中记录相应信息(日志级别为DEBUG),并直接返回true,表示无需进行实际删除操作。
|
|
|
|
if (ids == null) {
|
|
|
|
if (ids == null) {
|
|
|
|
Log.d(TAG, "the ids is null");
|
|
|
|
Log.d(TAG, "the ids is null");
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果ids集合大小为0,意味着集合中没有包含有效的笔记ID,同样在日志中记录信息(日志级别为DEBUG),然后返回true,表示没有笔记可删除。
|
|
|
|
if (ids.size() == 0) {
|
|
|
|
if (ids.size() == 0) {
|
|
|
|
Log.d(TAG, "no id is in the hashset");
|
|
|
|
Log.d(TAG, "no id is in the hashset");
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个用于存储内容提供器操作(ContentProviderOperation)的列表,后续将把要执行的删除操作添加到这个列表中。
|
|
|
|
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
|
|
|
|
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
|
|
|
|
|
|
|
|
// 遍历传入的ids集合,对每个要删除的笔记ID进行处理
|
|
|
|
for (long id : ids) {
|
|
|
|
for (long id : ids) {
|
|
|
|
|
|
|
|
// 如果笔记ID是系统根文件夹的ID(Notes.ID_ROOT_FOLDER),则不允许删除该系统文件夹,在日志中记录错误信息(日志级别为ERROR),并跳过本次循环,继续处理下一个ID。
|
|
|
|
if (id == Notes.ID_ROOT_FOLDER) {
|
|
|
|
if (id == Notes.ID_ROOT_FOLDER) {
|
|
|
|
Log.e(TAG, "Don't delete system folder root");
|
|
|
|
Log.e(TAG, "Don't delete system folder root");
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 创建一个用于删除操作的ContentProviderOperation构建器,指定要删除的笔记的URI(通过ContentUris.withAppendedId方法根据笔记ID构建对应的URI)。
|
|
|
|
ContentProviderOperation.Builder builder = ContentProviderOperation
|
|
|
|
ContentProviderOperation.Builder builder = ContentProviderOperation
|
|
|
|
.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
|
|
|
|
.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
|
|
|
|
|
|
|
|
// 将构建好的删除操作添加到操作列表中。
|
|
|
|
operationList.add(builder.build());
|
|
|
|
operationList.add(builder.build());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 通过内容解析器执行批量操作,传入内容提供器的授权信息(Notes.AUTHORITY)和操作列表,获取操作结果数组(ContentProviderResult[])。
|
|
|
|
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
|
|
|
|
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
|
|
|
|
|
|
|
|
// 如果操作结果数组为null,或者数组长度为0,或者数组中第一个元素为null,表示删除操作失败,在日志中记录相应信息(日志级别为DEBUG),并返回false。
|
|
|
|
if (results == null || results.length == 0 || results[0] == null) {
|
|
|
|
if (results == null || results.length == 0 || results[0] == null) {
|
|
|
|
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
|
|
|
|
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果操作结果正常,表示删除操作成功,返回true。
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
} catch (RemoteException e) {
|
|
|
|
} catch (RemoteException e) {
|
|
|
|
|
|
|
|
// 如果出现远程异常(RemoteException),通常是在与内容提供器进行远程通信时出现问题,在日志中记录详细的异常信息(包括异常的类名和具体消息),异常级别为ERROR。
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
} catch (OperationApplicationException e) {
|
|
|
|
} catch (OperationApplicationException e) {
|
|
|
|
|
|
|
|
// 如果出现操作应用异常(OperationApplicationException),一般是在应用执行批量操作时出现问题,同样在日志中记录详细异常信息(日志级别为ERROR)。
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果出现异常导致删除操作未能成功完成,返回false。
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将指定笔记移动到目标文件夹的方法,通过内容解析器更新笔记的相关属性(父文件夹ID等)来实现移动操作。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,用于执行数据库更新操作,以改变笔记所属的文件夹。
|
|
|
|
|
|
|
|
* @param id 要移动的笔记的唯一标识符(Long类型),用于确定具体是哪个笔记进行移动操作。
|
|
|
|
|
|
|
|
* @param srcFolderId 笔记当前所在文件夹的ID,用于记录笔记的原始文件夹信息(可能在后续业务逻辑中会用到,比如记录移动历史等)。
|
|
|
|
|
|
|
|
* @param desFolderId 笔记要移动到的目标文件夹的ID,指定笔记的新归属文件夹。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
|
|
|
|
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
|
|
|
|
|
|
|
|
// 创建一个ContentValues对象,用于存储要更新的键值对,即笔记的相关属性及其新的值。
|
|
|
|
ContentValues values = new ContentValues();
|
|
|
|
ContentValues values = new ContentValues();
|
|
|
|
|
|
|
|
// 设置笔记的新父文件夹ID(即目标文件夹ID),将其放入ContentValues中,键为NoteColumns.PARENT_ID。
|
|
|
|
values.put(NoteColumns.PARENT_ID, desFolderId);
|
|
|
|
values.put(NoteColumns.PARENT_ID, desFolderId);
|
|
|
|
|
|
|
|
// 设置笔记的原始父文件夹ID(即当前所在文件夹ID),键为NoteColumns.ORIGIN_PARENT_ID,可能用于后续追溯笔记的移动历史等情况。
|
|
|
|
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);
|
|
|
|
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);
|
|
|
|
|
|
|
|
// 设置笔记的本地修改标志为1,表示该笔记有本地修改(这里的修改指的是移动操作导致的变化),键为NoteColumns.LOCAL_MODIFIED。
|
|
|
|
values.put(NoteColumns.LOCAL_MODIFIED, 1);
|
|
|
|
values.put(NoteColumns.LOCAL_MODIFIED, 1);
|
|
|
|
|
|
|
|
// 通过内容解析器根据笔记的URI(通过ContentUris.withAppendedId方法根据笔记ID构建)更新笔记的属性,传入ContentValues对象以及其他相关参数(此处后两个参数为null,表示无额外的筛选条件和排序方式)。
|
|
|
|
resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);
|
|
|
|
resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 批量将多个笔记移动到指定文件夹的方法,通过构建批量更新操作并执行来实现。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,用于执行批量的数据库更新操作,将多个笔记移动到目标文件夹。
|
|
|
|
|
|
|
|
* @param ids 包含要移动笔记的唯一标识符(Long类型)的HashSet集合,如果为null,表示没有要移动的有效笔记,直接返回相应结果。
|
|
|
|
|
|
|
|
* @param folderId 目标文件夹的ID,所有传入的笔记都将被移动到这个文件夹下。
|
|
|
|
|
|
|
|
* @return 如果批量移动操作成功(即所有符合条件的笔记都被成功移动到目标文件夹),返回true;否则返回false。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean batchMoveToFolder(ContentResolver resolver, HashSet<Long> ids,
|
|
|
|
public static boolean batchMoveToFolder(ContentResolver resolver, HashSet<Long> ids,
|
|
|
|
long folderId) {
|
|
|
|
long folderId) {
|
|
|
|
|
|
|
|
// 如果传入的ids集合为null,说明没有指定要移动的笔记ID,在日志中记录相应信息(日志级别为DEBUG),并直接返回true,表示无需进行实际移动操作。
|
|
|
|
if (ids == null) {
|
|
|
|
if (ids == null) {
|
|
|
|
Log.d(TAG, "the ids is null");
|
|
|
|
Log.d(TAG, "the ids is null");
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个用于存储内容提供器操作(ContentProviderOperation)的列表,后续将把要执行的批量移动操作添加到这个列表中。
|
|
|
|
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
|
|
|
|
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
|
|
|
|
|
|
|
|
// 遍历传入的ids集合,对每个要移动的笔记ID进行处理,构建相应的更新操作。
|
|
|
|
for (long id : ids) {
|
|
|
|
for (long id : ids) {
|
|
|
|
|
|
|
|
// 创建一个用于更新操作的ContentProviderOperation构建器,指定要更新的笔记的URI(通过ContentUris.withAppendedId方法根据笔记ID构建对应的URI)。
|
|
|
|
ContentProviderOperation.Builder builder = ContentProviderOperation
|
|
|
|
ContentProviderOperation.Builder builder = ContentProviderOperation
|
|
|
|
.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
|
|
|
|
.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
|
|
|
|
|
|
|
|
// 设置笔记的新父文件夹ID(即目标文件夹ID),通过withValue方法将其添加到更新操作构建器中,键为NoteColumns.PARENT_ID。
|
|
|
|
builder.withValue(NoteColumns.PARENT_ID, folderId);
|
|
|
|
builder.withValue(NoteColumns.PARENT_ID, folderId);
|
|
|
|
|
|
|
|
// 设置笔记的本地修改标志为1,表示该笔记有本地修改(这里的修改指的是移动操作导致的变化),键为NoteColumns.LOCAL_MODIFIED。
|
|
|
|
builder.withValue(NoteColumns.LOCAL_MODIFIED, 1);
|
|
|
|
builder.withValue(NoteColumns.LOCAL_MODIFIED, 1);
|
|
|
|
|
|
|
|
// 将构建好的更新操作添加到操作列表中。
|
|
|
|
operationList.add(builder.build());
|
|
|
|
operationList.add(builder.build());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 通过内容解析器执行批量操作,传入内容提供器的授权信息(Notes.AUTHORITY)和操作列表,获取操作结果数组(ContentProviderResult[])。
|
|
|
|
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
|
|
|
|
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
|
|
|
|
|
|
|
|
// 如果操作结果数组为null,或者数组长度为0,或者数组中第一个元素为null,表示批量移动操作失败,在日志中记录相应信息(日志级别为DEBUG),并返回false。
|
|
|
|
if (results == null || results.length == 0 || results[0] == null) {
|
|
|
|
if (results == null || results.length == 0 || results[0] == null) {
|
|
|
|
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
|
|
|
|
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果操作结果正常,表示批量移动操作成功,返回true。
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
} catch (RemoteException e) {
|
|
|
|
} catch (RemoteException e) {
|
|
|
|
|
|
|
|
// 如果出现远程异常(RemoteException),通常是在与内容提供器进行远程通信时出现问题,在日志中记录详细的异常信息(包括异常的类名和具体消息),异常级别为ERROR。
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
} catch (OperationApplicationException e) {
|
|
|
|
} catch (OperationApplicationException e) {
|
|
|
|
|
|
|
|
// 如果出现操作应用异常(OperationApplicationException),一般是在应用执行批量操作时出现问题,同样在日志中记录详细异常信息(日志级别为ERROR)。
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果出现异常导致批量移动操作未能成功完成,返回false。
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}}
|
|
|
|
* 获取用户创建的文件夹数量(不包括系统文件夹)的方法,通过查询数据库来统计符合条件的文件夹数量。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,用于执行数据库查询操作,获取文件夹相关信息。
|
|
|
|
|
|
|
|
* @return 用户创建的文件夹数量(不包含系统文件夹),类型为int。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static int getUserFolderCount(ContentResolver resolver) {
|
|
|
|
public static int getUserFolderCount(ContentResolver resolver) {
|
|
|
|
|
|
|
|
// 通过内容解析器查询数据库,指定查询的URI为Notes.CONTENT_NOTE_URI(表示笔记相关的数据表,因为文件夹信息也存储在该表中,可能通过类型等字段区分),
|
|
|
|
|
|
|
|
// 要获取的列是"COUNT(*)",表示统计符合条件的记录数量。
|
|
|
|
|
|
|
|
// 查询条件是类型为文件夹(NoteColumns.TYPE + "=?)且父文件夹ID不等于回收站文件夹ID(NoteColumns.PARENT_ID + "<>?"),通过传入对应的参数值来筛选出用户创建的非回收站文件夹。
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
new String[] { "COUNT(*)" },
|
|
|
|
new String[] { "COUNT(*)" },
|
|
|
|
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?",
|
|
|
|
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?",
|
|
|
|
@ -122,21 +185,36 @@ public class DataUtils {
|
|
|
|
null);
|
|
|
|
null);
|
|
|
|
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
// 如果查询到的游标(Cursor)不为null,说明获取到了有效的查询结果,尝试获取数据。
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
|
|
|
|
// 将游标移动到第一条记录(如果有数据的话),因为查询结果只有一条记录(统计数量的结果),所以只需要获取这一条记录中的数据即可。
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 尝试从游标中获取第一个列(索引为0)的数据,这里就是统计得到的文件夹数量,将其赋值给count变量。
|
|
|
|
count = cursor.getInt(0);
|
|
|
|
count = cursor.getInt(0);
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
|
|
|
|
// 如果出现索引越界异常(IndexOutOfBoundsException),通常是获取数据的索引超出了游标实际包含的列范围,在日志中记录详细的异常信息(日志级别为ERROR)。
|
|
|
|
Log.e(TAG, "get folder count failed:" + e.toString());
|
|
|
|
Log.e(TAG, "get folder count failed:" + e.toString());
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 无论是否成功获取到数量数据,都需要关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回统计得到的用户文件夹数量。
|
|
|
|
return count;
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 检查指定笔记在笔记数据库中是否可见(根据给定的类型和是否不在回收站等条件判断)的方法,通过查询数据库判断是否存在符合条件的笔记记录。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,用于执行数据库查询操作,检查笔记是否存在。
|
|
|
|
|
|
|
|
* @param noteId 要检查的笔记的唯一标识符(Long类型),用于确定具体是哪个笔记进行可见性判断。
|
|
|
|
|
|
|
|
* @param type 笔记的类型,根据具体业务逻辑确定的类型值,用于进一步筛选判断笔记是否符合可见的条件。
|
|
|
|
|
|
|
|
* @return 如果笔记在数据库中存在且符合可见条件(即类型匹配且不在回收站等),返回true;否则返回false。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) {
|
|
|
|
public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) {
|
|
|
|
|
|
|
|
// 通过内容解析器查询数据库,指定查询的URI为Notes.CONTENT_NOTE_URI(对应笔记数据表),查询条件是类型为指定类型(NoteColumns.TYPE + "=?)且父文件夹ID不等于回收站文件夹ID(NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER),传入对应的参数值进行筛选。
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
|
|
|
|
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
|
|
|
|
@ -144,60 +222,114 @@ public class DataUtils {
|
|
|
|
null);
|
|
|
|
null);
|
|
|
|
|
|
|
|
|
|
|
|
boolean exist = false;
|
|
|
|
boolean exist = false;
|
|
|
|
|
|
|
|
// 如果查询到的游标(Cursor)不为null,说明获取到了有效的查询结果,进一步判断是否有符合条件的记录存在。
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
|
|
|
|
// 通过获取游标中的记录数量来判断是否存在符合条件的笔记,如果记录数量大于0,表示存在,将exist变量设置为true。
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
exist = true;
|
|
|
|
exist = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回笔记是否存在(即是否可见)的判断结果。
|
|
|
|
return exist;
|
|
|
|
return exist;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 检查指定笔记是否存在于笔记数据库中的方法,通过简单查询数据库判断是否存在对应笔记ID的记录。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于访问内容提供器的内容解析器对象,用于执行数据库查询操作,检查笔记是否存在。
|
|
|
|
|
|
|
|
* @param noteId 要检查的笔记的唯一标识符(Long类型),用于确定具体是哪个笔记进行存在性判断。
|
|
|
|
|
|
|
|
* @return 如果笔记在数据库中存在,返回true;否则返回false。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) {
|
|
|
|
public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) {
|
|
|
|
|
|
|
|
// 通过内容解析器查询数据库,指定查询的URI为Notes.CONTENT_NOTE_URI(对应笔记数据表),此处查询条件为空(即查询所有记录),尝试查找是否存在指定笔记ID的记录。
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
|
|
|
|
null, null, null, null);
|
|
|
|
null, null, null, null);
|
|
|
|
|
|
|
|
|
|
|
|
boolean exist = false;
|
|
|
|
boolean exist = false;
|
|
|
|
|
|
|
|
// 如果查询到的游标(Cursor)不为null,说明获取到了有效的查询结果,进一步判断是否有符合条件的记录存在。
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
|
|
|
|
// 通过获取游标中的记录数量来判断是否存在符合条件的笔记,如果记录数量大于0,表示存在,将exist变量设置为true。
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
exist = true;
|
|
|
|
exist = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回笔记是否存在的判断结果。
|
|
|
|
return exist;
|
|
|
|
return exist;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 检查指定的数据记录是否存在于数据数据库中。
|
|
|
|
|
|
|
|
* 通过使用传入的 `ContentResolver` 对象查询对应的数据表(`Notes.CONTENT_DATA_URI`),
|
|
|
|
|
|
|
|
* 不设置额外的筛选条件(即查询条件为 `null`),仅依据传入的数据ID来查找相应记录,然后根据查询结果判断其是否存在。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,借助它来发起数据库查询操作。
|
|
|
|
|
|
|
|
* @param dataId 要检查的数据记录在数据库中的唯一标识符,用于定位特定的数据记录。
|
|
|
|
|
|
|
|
* @return 如果在数据库中能找到对应 `dataId` 的数据记录,则返回 `true`;否则返回 `false`。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
|
|
|
|
public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI是Notes.CONTENT_DATA_URI(对应特定的数据表),
|
|
|
|
|
|
|
|
// 传入的查询条件等参数都为null,表示查询所有记录,只是依据传入的数据ID来定位可能存在的记录。
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),
|
|
|
|
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),
|
|
|
|
null, null, null, null);
|
|
|
|
null, null, null, null);
|
|
|
|
|
|
|
|
|
|
|
|
boolean exist = false;
|
|
|
|
boolean exist = false;
|
|
|
|
|
|
|
|
// 如果查询返回的游标(Cursor)不为null,说明查询有结果,进一步判断游标中是否有记录(即记录数量大于0)。
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
exist = true;
|
|
|
|
exist = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源,避免内存泄漏等问题。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return exist;
|
|
|
|
return exist;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 检查具有指定名称的文件夹是否在笔记数据库中可见(即满足特定条件:是文件夹类型、不在回收站且名称匹配)。
|
|
|
|
|
|
|
|
* 通过向 `ContentResolver` 发起查询操作,依据设定的条件在 `Notes.CONTENT_NOTE_URI` 对应的表中查找符合条件的文件夹记录,进而判断其是否存在。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,用于执行数据库查询操作。
|
|
|
|
|
|
|
|
* @param name 要检查的文件夹名称,用于在查询条件中匹配对应的文件夹记录。
|
|
|
|
|
|
|
|
* @return 如果存在满足条件(类型为文件夹、不在回收站且名称与传入的 `name` 一致)的文件夹记录,则返回 `true`;否则返回 `false`。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static boolean checkVisibleFolderName(ContentResolver resolver, String name) {
|
|
|
|
public static boolean checkVisibleFolderName(ContentResolver resolver, String name) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI为Notes.CONTENT_NOTE_URI(对应笔记相关的数据表),
|
|
|
|
|
|
|
|
// 查询条件设定为筛选出类型是文件夹(NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER)、父文件夹ID不等于回收站文件夹ID(NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER)
|
|
|
|
|
|
|
|
// 且文件夹摘要(可能用于显示文件夹名称等,此处对应条件判断)等于传入的 `name` 的记录,通过传入的 `name` 参数构建查询条件中的参数值。
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null,
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null,
|
|
|
|
NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER +
|
|
|
|
NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER +
|
|
|
|
" AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER +
|
|
|
|
" AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER +
|
|
|
|
" AND " + NoteColumns.SNIPPET + "=?",
|
|
|
|
" AND " + NoteColumns.SNIPPET + "=?",
|
|
|
|
new String[] { name }, null);
|
|
|
|
new String[] { name }, null);
|
|
|
|
boolean exist = false;
|
|
|
|
boolean exist = false;
|
|
|
|
|
|
|
|
// 如果查询返回的游标(Cursor)不为null,说明查询有结果,进一步判断游标中是否有记录(即记录数量大于0)。
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
if (cursor.getCount() > 0) {
|
|
|
|
exist = true;
|
|
|
|
exist = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return exist;
|
|
|
|
return exist;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取指定文件夹下所有笔记对应的小部件(Widget)属性信息,以 `HashSet` 集合形式返回。
|
|
|
|
|
|
|
|
* 通过向 `ContentResolver` 发起查询操作,从 `Notes.CONTENT_NOTE_URI` 对应的数据表中获取符合条件(所属文件夹为传入的 `folderId`)的笔记的小部件ID和小部件类型信息,
|
|
|
|
|
|
|
|
* 并将这些信息封装成 `AppWidgetAttribute` 对象后存入 `HashSet` 集合中返回。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,用于执行数据库查询操作来获取小部件相关信息。
|
|
|
|
|
|
|
|
* @param folderId 要查询的文件夹的唯一标识符,用于筛选出该文件夹下所有笔记对应的小部件信息。
|
|
|
|
|
|
|
|
* @return 包含指定文件夹下所有笔记对应的小部件属性信息的 `HashSet` 集合,如果没有符合条件的记录,则返回 `null`。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static HashSet<AppWidgetAttribute> getFolderNoteWidget(ContentResolver resolver, long folderId) {
|
|
|
|
public static HashSet<AppWidgetAttribute> getFolderNoteWidget(ContentResolver resolver, long folderId) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI为Notes.CONTENT_NOTE_URI(对应笔记相关数据表),
|
|
|
|
|
|
|
|
// 查询的列指定为NoteColumns.WIDGET_ID(小部件ID)和NoteColumns.WIDGET_TYPE(小部件类型),
|
|
|
|
|
|
|
|
// 查询条件设定为筛选出父文件夹ID等于传入的 `folderId` 的记录,通过传入的 `folderId` 参数构建查询条件中的参数值。
|
|
|
|
Cursor c = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
Cursor c = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE },
|
|
|
|
new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE },
|
|
|
|
NoteColumns.PARENT_ID + "=?",
|
|
|
|
NoteColumns.PARENT_ID + "=?",
|
|
|
|
@ -205,26 +337,45 @@ public class DataUtils {
|
|
|
|
null);
|
|
|
|
null);
|
|
|
|
|
|
|
|
|
|
|
|
HashSet<AppWidgetAttribute> set = null;
|
|
|
|
HashSet<AppWidgetAttribute> set = null;
|
|
|
|
|
|
|
|
// 如果查询返回的游标(Cursor)不为null,说明查询有结果,进一步处理获取到的数据。
|
|
|
|
if (c!= null) {
|
|
|
|
if (c!= null) {
|
|
|
|
if (c.moveToFirst()) {
|
|
|
|
if (c.moveToFirst()) {
|
|
|
|
set = new HashSet<AppWidgetAttribute>();
|
|
|
|
set = new HashSet<AppWidgetAttribute>();
|
|
|
|
do {
|
|
|
|
do {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 创建一个AppWidgetAttribute对象,用于封装小部件的属性信息。
|
|
|
|
AppWidgetAttribute widget = new AppWidgetAttribute();
|
|
|
|
AppWidgetAttribute widget = new AppWidgetAttribute();
|
|
|
|
|
|
|
|
// 从游标中获取小部件ID,并赋值给AppWidgetAttribute对象的widgetId属性,这里依据查询时指定的列顺序获取对应列的数据。
|
|
|
|
widget.widgetId = c.getInt(0);
|
|
|
|
widget.widgetId = c.getInt(0);
|
|
|
|
|
|
|
|
// 从游标中获取小部件类型,并赋值给AppWidgetAttribute对象的widgetType属性。
|
|
|
|
widget.widgetType = c.getInt(1);
|
|
|
|
widget.widgetType = c.getInt(1);
|
|
|
|
|
|
|
|
// 将封装好小部件属性信息的AppWidgetAttribute对象添加到HashSet集合中。
|
|
|
|
set.add(widget);
|
|
|
|
set.add(widget);
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
|
|
|
|
// 如果在获取游标数据时出现索引越界异常(例如获取的列索引超出了实际查询到的列范围),则记录错误日志,日志级别为ERROR。
|
|
|
|
Log.e(TAG, e.toString());
|
|
|
|
Log.e(TAG, e.toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (c.moveToNext());
|
|
|
|
} while (c.moveToNext());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
c.close();
|
|
|
|
c.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return set;
|
|
|
|
return set;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据给定的笔记ID,从数据库中获取与之关联的电话号码(通常用于通话记录相关的笔记场景)。
|
|
|
|
|
|
|
|
* 通过向 `ContentResolver` 发起查询操作,在 `Notes.CONTENT_DATA_URI` 对应的数据表中,依据设定的条件(笔记ID和MIME类型等)查找电话号码信息。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,用于执行数据库查询操作来获取电话号码信息。
|
|
|
|
|
|
|
|
* @param noteId 要查找电话号码的笔记在数据库中的唯一标识符,用于定位特定的笔记记录。
|
|
|
|
|
|
|
|
* @return 如果能找到对应笔记ID且符合条件的记录,返回该记录中的电话号码信息(字符串形式);如果未找到符合条件的记录,则返回空字符串 ""。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {
|
|
|
|
public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI为Notes.CONTENT_DATA_URI(对应笔记相关的数据表,可能包含通话记录等详细数据),
|
|
|
|
|
|
|
|
// 查询的列指定为CallNote.PHONE_NUMBER(表示电话号码的列),
|
|
|
|
|
|
|
|
// 查询条件设定为筛选出笔记ID等于传入的 `noteId` 且MIME类型等于CallNote.CONTENT_ITEM_TYPE(特定的MIME类型,可能用于标识通话记录相关的数据类型)的记录,
|
|
|
|
|
|
|
|
// 通过传入的 `noteId` 和 `CallNote.CONTENT_ITEM_TYPE` 参数构建查询条件中的参数值。
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
|
|
|
|
new String [] { CallNote.PHONE_NUMBER },
|
|
|
|
new String [] { CallNote.PHONE_NUMBER },
|
|
|
|
CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?",
|
|
|
|
CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?",
|
|
|
|
@ -233,17 +384,34 @@ public class DataUtils {
|
|
|
|
|
|
|
|
|
|
|
|
if (cursor!= null && cursor.moveToFirst()) {
|
|
|
|
if (cursor!= null && cursor.moveToFirst()) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 尝试从游标中获取第一个列(因为查询时只指定了获取电话号码这一列,索引为0)的数据,即电话号码信息,并返回。
|
|
|
|
return cursor.getString(0);
|
|
|
|
return cursor.getString(0);
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
|
|
|
|
// 如果在获取游标数据时出现索引越界异常,则记录错误日志,日志级别为ERROR,记录详细的异常信息。
|
|
|
|
Log.e(TAG, "Get call number fails " + e.toString());
|
|
|
|
Log.e(TAG, "Get call number fails " + e.toString());
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 无论是否成功获取到电话号码,都要关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据给定的电话号码和通话日期,从数据库中查找与之关联的笔记ID。
|
|
|
|
|
|
|
|
* 通过向 `ContentResolver` 发起查询操作,在 `Notes.CONTENT_DATA_URI` 对应的数据表中,依据设定的条件(通话日期、MIME类型以及电话号码匹配等)查找对应的笔记ID信息。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,用于执行数据库查询操作来获取笔记ID信息。
|
|
|
|
|
|
|
|
* @param phoneNumber 要查找关联笔记ID的电话号码,用于在查询条件中匹配对应的通话记录笔记。
|
|
|
|
|
|
|
|
* @param callDate 通话日期(时间戳形式),用于在查询条件中进一步精准定位对应的通话记录笔记。
|
|
|
|
|
|
|
|
* @return 如果能找到符合条件(通话日期、MIME类型以及电话号码匹配)的记录,返回该记录中的笔记ID信息(长整型);如果未找到符合条件的记录,则返回0。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
|
|
|
|
public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI为Notes.CONTENT_DATA_URI(对应笔记相关的数据表,包含通话记录等详细数据),
|
|
|
|
|
|
|
|
// 查询的列指定为CallNote.NOTE_ID(表示笔记ID的列),
|
|
|
|
|
|
|
|
// 查询条件设定为筛选出通话日期等于传入的 `callDate`、MIME类型等于CallNote.CONTENT_ITEM_TYPE(特定的MIME类型,标识通话记录相关数据类型)
|
|
|
|
|
|
|
|
// 并且电话号码通过自定义函数(PHONE_NUMBERS_EQUAL,具体实现可能在别处,用于更准确地匹配电话号码)匹配传入的 `phoneNumber` 的记录,
|
|
|
|
|
|
|
|
// 通过传入的 `callDate`、`CallNote.CONTENT_ITEM_TYPE` 和 `phoneNumber` 参数构建查询条件中的参数值。
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
|
|
|
|
new String [] { CallNote.NOTE_ID },
|
|
|
|
new String [] { CallNote.NOTE_ID },
|
|
|
|
CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL("
|
|
|
|
CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL("
|
|
|
|
@ -254,17 +422,32 @@ public class DataUtils {
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 尝试从游标中获取第一个列(因为查询时只指定了获取笔记ID这一列,索引为0)的数据,即笔记ID信息,并返回。
|
|
|
|
return cursor.getLong(0);
|
|
|
|
return cursor.getLong(0);
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
|
|
|
|
// 如果在获取游标数据时出现索引越界异常,则记录错误日志,日志级别为ERROR,记录详细的异常信息。
|
|
|
|
Log.e(TAG, "Get call note id fails " + e.toString());
|
|
|
|
Log.e(TAG, "Get call note id fails " + e.toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据给定的笔记ID,从数据库中获取与之对应的摘要(Snippet)信息。
|
|
|
|
|
|
|
|
* 通过向 `ContentResolver` 发起查询操作,在 `Notes.CONTENT_NOTE_URI` 对应的数据表中,依据笔记ID查找对应的摘要信息。
|
|
|
|
|
|
|
|
* 如果未找到对应笔记ID的记录,则抛出 `IllegalArgumentException` 异常,表示指定的笔记不存在。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param resolver 用于与内容提供器交互的 `ContentResolver` 对象,用于执行数据库查询操作来获取摘要信息。
|
|
|
|
|
|
|
|
* @param noteId 要查找摘要信息的笔记在数据库中的唯一标识符,用于定位特定的笔记记录。
|
|
|
|
|
|
|
|
* @return 如果能找到对应笔记ID的记录,返回该记录中的摘要信息(字符串形式);如果未找到,则抛出 `IllegalArgumentException` 异常。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static String getSnippetById(ContentResolver resolver, long noteId) {
|
|
|
|
public static String getSnippetById(ContentResolver resolver, long noteId) {
|
|
|
|
|
|
|
|
// 使用ContentResolver发起查询操作,查询的URI为Notes.CONTENT_NOTE_URI(对应笔记相关的数据表),
|
|
|
|
|
|
|
|
// 查询的列指定为NoteColumns.SNIPPET(表示摘要的列),
|
|
|
|
|
|
|
|
// 查询条件设定为筛选出笔记ID等于传入的 `noteId` 的记录,通过传入的 `noteId` 参数构建查询条件中的参数值。
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
|
|
|
|
new String [] { NoteColumns.SNIPPET },
|
|
|
|
new String [] { NoteColumns.SNIPPET },
|
|
|
|
NoteColumns.ID + "=?",
|
|
|
|
NoteColumns.ID + "=?",
|
|
|
|
@ -274,19 +457,30 @@ public class DataUtils {
|
|
|
|
if (cursor!= null) {
|
|
|
|
if (cursor!= null) {
|
|
|
|
String snippet = "";
|
|
|
|
String snippet = "";
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
if (cursor.moveToFirst()) {
|
|
|
|
|
|
|
|
// 尝试从游标中获取第一个列(因为查询时只指定了获取摘要这一列,索引为0)的数据,即摘要信息,并赋值给变量 `snippet`。
|
|
|
|
snippet = cursor.getString(0);
|
|
|
|
snippet = cursor.getString(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭游标,释放相关资源。
|
|
|
|
cursor.close();
|
|
|
|
cursor.close();
|
|
|
|
return snippet;
|
|
|
|
return snippet;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
throw new IllegalArgumentException("Note is not found with id: " + noteId);
|
|
|
|
throw new IllegalArgumentException("Note is not found with id: " + noteId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 对给定的摘要(Snippet)字符串进行格式化处理,主要功能是去除字符串前后的空白字符(空格、制表符、换行符等),
|
|
|
|
|
|
|
|
* 并且如果字符串中包含换行符 `\n`,则截取换行符之前的部分作为格式化后的字符串返回。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param snippet 要进行格式化处理的摘要字符串,可能来自于笔记的相关信息展示等场景。
|
|
|
|
|
|
|
|
* @return 格式化后的摘要字符串,去除了前后空白字符以及换行符之后的内容(如果有换行符的话)。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static String getFormattedSnippet(String snippet) {
|
|
|
|
public static String getFormattedSnippet(String snippet) {
|
|
|
|
if (snippet!= null) {
|
|
|
|
if (snippet!= null) {
|
|
|
|
|
|
|
|
// 去除字符串前后的空白字符,调用trim方法进行处理。
|
|
|
|
snippet = snippet.trim();
|
|
|
|
snippet = snippet.trim();
|
|
|
|
int index = snippet.indexOf('\n');
|
|
|
|
int index = snippet.indexOf('\n');
|
|
|
|
if (index!= -1) {
|
|
|
|
if (index!= -1) {
|
|
|
|
|
|
|
|
// 如果字符串中包含换行符,截取换行符之前的部分作为最终的格式化后的字符串,通过substring方法实现截取操作。
|
|
|
|
snippet = snippet.substring(0, index);
|
|
|
|
snippet = snippet.substring(0, index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|