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.
yzy_502/src/tool/DataUtils.java

367 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.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.tool;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
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";
/**
* 批量删除笔记方法
*
* @param resolver ContentResolver对象用于访问应用数据
* @param ids 要删除的笔记的ID集合
* @return 删除是否成功成功返回true否则返回false
*/
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
// 检查输入的ids是否为null
if (ids == null) {
Log.d(TAG, "ids 为 null");
return true;
}
// 检查ids集合是否为空
if (ids.size() == 0) {
Log.d(TAG, "哈希集合中没有 id");
return true;
}
// 准备ContentProviderOperation集合用于批量处理删除操作
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
for (long id : ids) {
// 检查是否为系统文件夹根目录,如果是则跳过
if (id == Notes.ID_ROOT_FOLDER) {
Log.e(TAG, "不要删除系统文件夹根目录");
continue;
}
// 创建删除笔记的ContentProviderOperation.Builder对象
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, "删除笔记失败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;
}
/**
* 将笔记移动到指定文件夹方法
*
* @param resolver ContentResolver对象用于访问应用数据
* @param id 要移动的笔记ID
* @param srcFolderId 源文件夹ID
* @param desFolderId 目标文件夹ID
*/
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
// 准备ContentValues对象用于更新笔记的父文件夹信息
ContentValues values = new ContentValues();
values.put(NoteColumns.PARENT_ID, desFolderId);
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);
values.put(NoteColumns.LOCAL_MODIFIED, 1);
// 执行更新操作
resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);
}
}
/**
* Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}}
*/
/**
* 获取用户文件夹的数量
*
* @param resolver ContentResolver对象用于访问应用数据
* @return 用户文件夹的数量
*/
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, "获取文件夹数量失败:" + e.toString());
} finally {
cursor.close();
}
}
}
return count;
}
/**
* 检查笔记是否在数据库中可见
*
* @param resolver ContentResolver对象用于访问应用数据
* @param noteId 笔记的ID
* @param type 笔记的类型
* @return 笔记是否在数据库中可见
*/
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;
}
/**
* 检查笔记是否存在于数据库中
*
* @param resolver ContentResolver对象用于访问应用数据
* @param noteId 笔记的ID
* @return 笔记是否存在于数据库中
*/
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;
}
/**
* 判断给定的数据ID是否存在于数据数据库中。
*
* @param resolver 用于访问ContentProvider的ContentResolver对象。
* @param dataId 要检查的数据ID。
* @return 如果数据存在则返回true否则返回false。
*/
public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
// 通过ContentUris构建带有指定数据ID的URI并查询相应的数据。
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),
null, null, null, null);
boolean exist = false;
if (cursor != null) {
// 如果查询到的数据行数大于0则说明数据存在。
if (cursor.getCount() > 0) {
exist = true;
}
cursor.close();
}
return exist;
}
/**
* 检查给定名称的可见文件夹是否存在。
*
* @param resolver 用于访问ContentProvider的ContentResolver对象。
* @param name 要检查的文件夹名称。
* @return 如果文件夹存在则返回true否则返回false。
*/
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) {
// 如果查询到的数据行数大于0则说明文件夹存在。
if(cursor.getCount() > 0) {
exist = true;
}
cursor.close();
}
return exist;
}
/**
* 获取文件夹笔记小部件信息。
*
* @param resolver 用于访问ContentProvider的ContentResolver对象。
* @param folderId 要检索小部件信息的文件夹ID。
* @return 包含小部件属性的HashSet集合如果没有数据则返回null。
*/
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);
widget.widgetType = c.getInt(1);
set.add(widget);
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, e.toString());
}
} while (c.moveToNext());
}
c.close();
}
return set;
}
/**
* 通过笔记ID获取通话号码。
*
* @param resolver 用于访问ContentProvider的ContentResolver对象。
* @param noteId 要检索通话号码的笔记ID。
* @return 笔记相关的通话号码,如果没有找到则返回空字符串。
*/
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, "获取通话号码失败 " + e.toString());
} finally {
cursor.close();
}
}
return "";
}
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 {
// 获取通话笔记的ID并返回
return cursor.getLong(0);
} catch (IndexOutOfBoundsException e) {
// 处理异常,记录错误日志
Log.e(TAG, "Get call note id fails " + e.toString());
}
}
cursor.close();
}
// 如果没有匹配的通话笔记则返回0
return 0;
}
public static String getSnippetById(ContentResolver resolver, long noteId) {
// 根据通话笔记的ID查询相应的摘要信息
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;
}