You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xiaomibianqian/DataUtils.java

306 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 版权所有 (c) 2010-2011, The MiCode 开源社区 (www.micode.net)
*
* 根据 Apache License, Version 2.0(“许可证”)获得许可;
* 除非遵守许可证,否则不得使用此文件。
* 您可以在以下网址获得许可证的副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 除非适用法律要求或书面同意,否则根据许可证分发的软件以“原样”分发,
* 没有任何明示或暗示的保证,包括但不限于适销性、针对特定用途的适用性等任何明示或暗示的保证。
* 请参阅许可证以获取有关许可下的权利和限制的特定语言。
*/
package net.micode.notes.tool; // 定义包名
import android.content.ContentProviderOperation; // 用于执行内容提供者操作
import android.content.ContentProviderResult; // 用于处理内容提供者操作的结果
import android.content.ContentResolver; // 用于访问内容提供者
import android.content.ContentUris; // 用于构建内容URI
import android.content.ContentValues; // 用于存储键值对
import android.content.OperationApplicationException; // 操作应用异常
import android.database.Cursor; // 用于访问数据库的游标
import android.os.RemoteException; // 远程异常
import android.util.Log; // 日志类
import net.micode.notes.data.Notes; // 笔记数据类
import net.micode.notes.data.Notes.CallNote; // 通话笔记数据类
import net.micode.notes.data.Notes.NoteColumns; // 笔记列数据类
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; // 小部件属性类
import java.util.ArrayList; // 动态数组
import java.util.HashSet; // 哈希集合
public class DataUtils {
public static final String TAG = "DataUtils"; // 日志标签
// 批量删除笔记
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
if (ids == null) {
Log.d(TAG, "the ids is null"); // 如果id为null记录日志并返回true
return true;
}
if (ids.size() == 0) {
Log.d(TAG, "no id is in the hashset"); // 如果哈希集中没有id记录日志并返回true
return true;
}
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
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)); // 创建删除操作
operationList.add(builder.build()); // 添加到操作列表
}
try {
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); // 应用批量操作
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; // 异常时返回false
}
// 将笔记移动到另一个文件夹
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(NoteColumns.PARENT_ID, desFolderId); // 设置目标文件夹id
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); // 设置原始文件夹id
values.put(NoteColumns.LOCAL_MODIFIED, 1); // 设置本地修改标志为1
resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); // 更新笔记
}
// 批量将笔记移动到指定文件夹
public static boolean batchMoveToFolder(ContentResolver resolver, HashSet<Long> ids,
long folderId) {
if (ids == null) {
Log.d(TAG, "the ids is null"); // id为null时记录日志并返回true
return true;
}
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
for (long id : ids) {
ContentProviderOperation.Builder builder = ContentProviderOperation
.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); // 创建更新操作
builder.withValue(NoteColumns.PARENT_ID, folderId); // 设置目标文件夹id
builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); // 设置本地修改标志为1
operationList.add(builder.build()); // 添加到操作列表
}
try {
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); // 应用批量操作
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; // 异常时返回false
}
/**
* 获取所有非系统文件夹的数量
*/
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);
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),
null,
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
new String [] {String.valueOf(type)},
null);
boolean exist = false;
if (cursor != null) {
if (cursor.getCount() > 0) {
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<AppWidgetAttribute> 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);
HashSet<AppWidgetAttribute> set = null;
if (c != null) {
if (c.moveToFirst()) {
set = new HashSet<AppWidgetAttribute>();
do {
try {
AppWidgetAttribute widget = new AppWidgetAttribute();
widget.widgetId = c.getInt(0); // 获取小部件ID
widget.widgetType = c.getInt(1); // 获取小部件类型
set.add(widget); // 添加到集合中
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, e.toString()); // 异常,记录错误日志
}
} while (c.moveToNext());
}
c.close(); // 关闭游标
}
return set; // 返回小部件集合
}
// 根据笔记ID获取呼叫号码
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 ""; // 未找到时返回空字符串
}
// 根据电话号码和呼叫日期获取笔记ID
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);
if (cursor != null) {
if (cursor.moveToFirst()) {
try {
return cursor.getLong(0); // 获取笔记ID
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, "Get call note id fails " + e.toString()); // 异常,记录错误日志
}
}
cursor.close(); // 关闭游标
}
return 0; // 未找到时返回0
}
// 根据ID获取笔记摘要
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);
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; // 返回格式化后的摘要
}
}