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.
wzy/Desktop/xiaomi/src/model/Note.java

362 lines
12 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.

package net.micode.notes.model;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.net.Uri;
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.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.Notes.TextNote;
import java.util.ArrayList;
/**
* Note类用于管理笔记数据包括笔记的基本信息和相关数据如文本内容、通话记录
*/
public class Note {
// 存储笔记基本信息的变更值
private ContentValues mNoteDiffValues;
// 管理笔记相关数据(文本和通话记录)
private NoteData mNoteData;
private static final String TAG = "Note";
/**
* 创建一个新的笔记ID并在数据库中添加一条笔记记录
*
* @param context 应用上下文
* @param folderId 父文件夹ID
* @return 新创建的笔记ID
* @throws IllegalStateException 如果获取的笔记ID无效
*/
public static synchronized long getNewNoteId(Context context, long folderId) {
// 创建一个新的笔记记录
ContentValues values = new ContentValues();
long createdTime = System.currentTimeMillis();
values.put(NoteColumns.CREATED_DATE, createdTime);
values.put(NoteColumns.MODIFIED_DATE, createdTime);
values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
values.put(NoteColumns.LOCAL_MODIFIED, 1);
values.put(NoteColumns.PARENT_ID, folderId);
// 插入笔记记录并获取URI
Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
long noteId = 0;
try {
// 从URI中提取笔记ID
noteId = Long.valueOf(uri.getPathSegments().get(1));
} catch (NumberFormatException e) {
Log.e(TAG, "获取笔记ID错误 :" + e.toString());
noteId = 0;
}
// 检查笔记ID的有效性
if (noteId == -1) {
throw new IllegalStateException("错误的笔记ID:" + noteId);
}
return noteId;
}
/**
* 构造函数,初始化笔记对象
*/
public Note() {
mNoteDiffValues = new ContentValues();
mNoteData = new NoteData();
}
/**
* 设置笔记的基本信息
*
* @param key 键名
* @param value 值
*/
public void setNoteValue(String key, String value) {
mNoteDiffValues.put(key, value);
// 标记笔记已修改,并更新修改时间
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
/**
* 设置笔记的文本内容
*
* @param key 键名
* @param value 值
*/
public void setTextData(String key, String value) {
mNoteData.setTextData(key, value);
}
/**
* 设置文本内容的ID
*
* @param id 文本内容ID
*/
public void setTextDataId(long id) {
mNoteData.setTextDataId(id);
}
/**
* 获取文本内容的ID
*
* @return 文本内容ID
*/
public long getTextDataId() {
return mNoteData.mTextDataId;
}
/**
* 设置通话记录的ID
*
* @param id 通话记录ID
*/
public void setCallDataId(long id) {
mNoteData.setCallDataId(id);
}
/**
* 设置通话记录数据
*
* @param key 键名
* @param value 值
*/
public void setCallData(String key, String value) {
mNoteData.setCallData(key, value);
}
/**
* 检查笔记是否有本地修改
*
* @return 如果有修改返回true否则返回false
*/
public boolean isLocalModified() {
return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified();
}
/**
* 将笔记同步到数据库
*
* @param context 应用上下文
* @param noteId 笔记ID
* @return 同步成功返回true失败返回false
* @throws IllegalArgumentException 如果笔记ID无效
*/
public boolean syncNote(Context context, long noteId) {
// 检查笔记ID的有效性
if (noteId <= 0) {
throw new IllegalArgumentException("错误的笔记ID:" + noteId);
}
// 如果没有修改,直接返回成功
if (!isLocalModified()) {
return true;
}
/**
* 理论上一旦数据发生变化笔记应该更新LOCAL_MODIFIED和MODIFIED_DATE字段。
* 为了数据安全,即使更新笔记失败,我们仍然尝试更新笔记数据信息
*/
if (context.getContentResolver().update(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null,
null) == 0) {
Log.e(TAG, "更新笔记错误,这不应发生");
// 不返回,继续执行
}
// 清空已同步的变更值
mNoteDiffValues.clear();
// 同步笔记数据如果失败则返回false
if (mNoteData.isLocalModified()
&& (mNoteData.pushIntoContentResolver(context, noteId) == null)) {
return false;
}
return true;
}
/**
* 内部类,管理笔记的相关数据(文本和通话记录)
*/
private class NoteData {
// 文本内容ID
private long mTextDataId;
// 存储文本内容变更值
private ContentValues mTextDataValues;
// 通话记录ID
private long mCallDataId;
// 存储通话记录变更值
private ContentValues mCallDataValues;
private static final String TAG = "NoteData";
/**
* 构造函数,初始化笔记数据对象
*/
public NoteData() {
mTextDataValues = new ContentValues();
mCallDataValues = new ContentValues();
mTextDataId = 0;
mCallDataId = 0;
}
/**
* 检查笔记数据是否有本地修改
*
* @return 如果有修改返回true否则返回false
*/
boolean isLocalModified() {
return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
}
/**
* 设置文本内容ID
*
* @param id 文本内容ID
* @throws IllegalArgumentException 如果ID无效
*/
void setTextDataId(long id) {
if(id <= 0) {
throw new IllegalArgumentException("文本数据ID应大于0");
}
mTextDataId = id;
}
/**
* 设置通话记录ID
*
* @param id 通话记录ID
* @throws IllegalArgumentException 如果ID无效
*/
void setCallDataId(long id) {
if (id <= 0) {
throw new IllegalArgumentException("通话数据ID应大于0");
}
mCallDataId = id;
}
/**
* 设置通话记录数据
*
* @param key 键名
* @param value 值
*/
void setCallData(String key, String value) {
mCallDataValues.put(key, value);
// 标记笔记已修改,并更新修改时间
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
/**
* 设置文本内容数据
*
* @param key 键名
* @param value 值
*/
void setTextData(String key, String value) {
mTextDataValues.put(key, value);
// 标记笔记已修改,并更新修改时间
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
/**
* 将笔记数据推送到内容提供者(数据库)
*
* @param context 应用上下文
* @param noteId 笔记ID
* @return 操作成功返回笔记URI失败返回null
* @throws IllegalArgumentException 如果笔记ID无效
*/
Uri pushIntoContentResolver(Context context, long noteId) {
/**
* 安全检查
*/
if (noteId <= 0) {
throw new IllegalArgumentException("错误的笔记ID:" + noteId);
}
// 创建批量操作列表
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder builder = null;
// 处理文本内容变更
if(mTextDataValues.size() > 0) {
mTextDataValues.put(DataColumns.NOTE_ID, noteId);
// 如果是新文本内容,执行插入操作
if (mTextDataId == 0) {
mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
mTextDataValues);
try {
// 从URI中提取并设置新的文本内容ID
setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));
} catch (NumberFormatException e) {
Log.e(TAG, "插入新文本数据失败笔记ID为" + noteId);
mTextDataValues.clear();
return null;
}
} else {
// 如果是已有文本内容,执行更新操作
builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mTextDataId));
builder.withValues(mTextDataValues);
operationList.add(builder.build());
}
// 清空已处理的变更值
mTextDataValues.clear();
}
// 处理通话记录变更,逻辑与文本内容类似
if(mCallDataValues.size() > 0) {
mCallDataValues.put(DataColumns.NOTE_ID, noteId);
if (mCallDataId == 0) {
mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
mCallDataValues);
try {
setCallDataId(Long.valueOf(uri.getPathSegments().get(1)));
} catch (NumberFormatException e) {
Log.e(TAG, "插入新通话数据失败笔记ID为" + noteId);
mCallDataValues.clear();
return null;
}
} else {
builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mCallDataId));
builder.withValues(mCallDataValues);
operationList.add(builder.build());
}
mCallDataValues.clear();
}
// 执行批量操作
if (operationList.size() > 0) {
try {
ContentProviderResult[] results = context.getContentResolver().applyBatch(
Notes.AUTHORITY, operationList);
return (results == null || results.length == 0 || results[0] == null) ? null
: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);
} catch (RemoteException e) {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
} catch (OperationApplicationException e) {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
}
}
return null;
}
}
}