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.
git-test/src/net/micode/notes/tool/DataUtils.java

349 lines
15 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";
// 批量删除笔记的静态方法
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> 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;// 如果为空,返回删除成功
}
// 创建一个操作列表,用于存储批量操作的删除操作
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
// 遍历传入的笔记ID集合为每个ID创建一个删除操作并添加到操作列表中
for (long id : ids) {
// 检查是否为系统文件夹的ID如果是跳过不删除
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;// 返回删除失败
}
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
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);
}
public static boolean batchMoveToFolder(ContentResolver resolver, HashSet<Long> ids,
long folderId) {
// 检查传入的笔记ID集合是否为空
if (ids == null) {
Log.d(TAG, "the ids is null");
return true;// 如果为空,返回移动成功
}
// 创建一个操作列表,用于存储批量操作的更新操作
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
// 遍历传入的笔记ID集合为每个ID创建一个更新操作并设置新的父文件夹ID和本地修改标志
for (long id : ids) {
// 创建更新操作的构建器
ContentProviderOperation.Builder builder = ContentProviderOperation
.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
// 设置更新操作的值包括新的父文件夹ID和本地修改标志
builder.withValue(NoteColumns.PARENT_ID, folderId);
builder.withValue(NoteColumns.LOCAL_MODIFIED, 1);
// 将更新操作添加到操作列表中
operationList.add(builder.build());
}
try {
// 应用批量操作更新笔记的父文件夹ID和本地修改标志
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;
}
/**
* Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}}
*/
public static int getUserFolderCount(ContentResolver resolver) {
// 查询用户文件夹的数量
Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI,
new String[] { "COUNT(*)" },
// 查询条件类型为文件夹且父文件夹ID不是回收站文件夹ID
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) {
// 查询指定笔记ID的可见性
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
null,
// 查询条件类型为指定类型且父文件夹ID不是回收站文件夹ID
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
new String [] {String.valueOf(type)},
null);
boolean exist = false;
if (cursor != null) {
// 如果查询结果非空检查结果数量是否大于0表示存在
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;// 返回是否存在
}
public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) {
// 查询指定笔记ID是否存在于笔记数据库中
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
null, null, null, null);
boolean exist = false;
if (cursor != null) {
// 如果查询结果非空检查结果数量是否大于0表示存在
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;// 返回是否存在
}
public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
// 查询指定数据ID是否存在于数据数据库中
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;// 返回是否存在
}
public static boolean checkVisibleFolderName(ContentResolver resolver, String name) {
// 查询是否存在具有指定名称的可见文件夹
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null,
// 查询条件类型为文件夹、父文件夹ID不是回收站文件夹ID、且摘要等于指定名称
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; // 返回是否存在
}
public static HashSet<AppWidgetAttribute> getFolderNoteWidget(ContentResolver resolver, long folderId) {
// 查询指定文件夹ID下的笔记小部件信息
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 对象获取小部件ID和小部件类型添加到集合中
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;// 返回包含小部件信息的集合
}
public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {
// 查询指定笔记ID对应的通话笔记的电话号码
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 "";// 如果查询结果为空,返回空字符串
}
public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
// 查询指定电话号码和通话日期对应的通话笔记的笔记ID
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();
}
return 0; // 如果查询结果为空返回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;// 返回格式化后的摘要信息
}
}