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.
5._Open-source-software-rea.../src/gtask/data/SqlData.java

223 lines
9.1 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.

/*
* SqlData 类用于操作和管理数据库中的数据项。
* 提供了从 JSON 对象设置内容,从数据库 Cursor 加载数据,以及提交数据更新到数据库的功能。
*/
package net.micode.notes.gtask.data;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
import net.micode.notes.gtask.exception.ActionFailureException;
import org.json.JSONException;
import org.json.JSONObject;
public class SqlData {
// 日志标签
private static final String TAG = SqlData.class.getSimpleName();
// 无效ID常量
private static final int INVALID_ID = -99999;
// 查询时使用的字段投影
public static final String[] PROJECTION_DATA = new String[]{
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
// 字段在Cursor中的索引
public static final int DATA_ID_COLUMN = 0;
public static final int DATA_MIME_TYPE_COLUMN = 1;
public static final int DATA_CONTENT_COLUMN = 2;
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
// ContentResolver用于操作内容提供者
private ContentResolver mContentResolver;
// 标记当前对象是创建状态还是更新状态
private boolean mIsCreate;
// 数据项ID
private long mDataId;
// 数据项的MIME类型
private String mDataMimeType;
// 数据项的内容
private String mDataContent;
// 数据项的附加数据1
private long mDataContentData1;
// 数据项的附加数据3
private String mDataContentData3;
// 存储与数据库不同步的数据变化
private ContentValues mDiffDataValues;
/*
* SqlData 构造函数,用于创建新的数据项。
* @param context 上下文对象用于获取ContentResolver。
*/
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true; // 设置为创建状态
mDataId = INVALID_ID; // 初始化为无效ID
mDataMimeType = DataConstants.NOTE; // 默认MIME类型为笔记
mDataContent = ""; // 内容初始化为空
mDataContentData1 = 0; // 附加数据1初始化为0
mDataContentData3 = ""; // 附加数据3初始化为空
mDiffDataValues = new ContentValues(); // 初始化差异数据值
}
/*
* SqlData 构造函数,用于加载现有数据项。
* @param context 上下文对象用于获取ContentResolver。
* @param c 数据项的Cursor对象用于加载数据。
*/
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false; // 设置为更新状态
loadFromCursor(c); // 从Cursor中加载数据
mDiffDataValues = new ContentValues(); // 初始化差异数据值
}
/*
* 从Cursor中加载数据。
* @param c 数据项的Cursor对象。
*/
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN); // 获取数据项ID
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); // 获取MIME类型
mDataContent = c.getString(DATA_CONTENT_COLUMN); // 获取内容
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); // 获取附加数据1
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); // 获取附加数据3
}
/*
* 根据JSON对象设置数据项内容。
* @param js JSON对象包含数据项的内容。
* @throws JSONException 如果解析JSON时出错。
*/
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; // 获取ID
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId); // 保存ID变化
}
mDataId = dataId; // 设置ID
String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE; // 获取MIME类型
if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); // 保存MIME类型变化
}
mDataMimeType = dataMimeType; // 设置MIME类型
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; // 获取内容
if (mIsCreate || !mDataContent.equals(dataContent)) {
mDiffDataValues.put(DataColumns.CONTENT, dataContent); // 保存内容变化
}
mDataContent = dataContent; // 设置内容
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; // 获取附加数据1
if (mIsCreate || mDataContentData1 != dataContentData1) {
mDiffDataValues.put(DataColumns.DATA1, dataContentData1); // 保存附加数据1变化
}
mDataContentData1 = dataContentData1; // 设置附加数据1
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; // 获取附加数据3
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
mDiffDataValues.put(DataColumns.DATA3, dataContentData3); // 保存附加数据3变化
}
mDataContentData3 = dataContentData3; // 设置附加数据3
}
/*
* 获取数据项的内容转换为JSON对象。
* @return JSON对象包含数据项的内容。
* @throws JSONException 如果构建JSON对象时出错。
*/
public JSONObject getContent() throws JSONException {
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet"); // 输出错误信息
return null; // 如果未创建则返回null
}
JSONObject js = new JSONObject(); // 创建JSON对象
js.put(DataColumns.ID, mDataId); // 加入ID
js.put(DataColumns.MIME_TYPE, mDataMimeType); // 加入MIME类型
js.put(DataColumns.CONTENT, mDataContent); // 加入内容
js.put(DataColumns.DATA1, mDataContentData1); // 加入附加数据1
js.put(DataColumns.DATA3, mDataContentData3); // 加入附加数据3
return js; // 返回JSON对象
}
/*
* 将数据项提交到数据库,如果是新数据项则插入,否则更新。
* @param noteId 符合此数据项的笔记ID。
* @param validateVersion 是否验证版本号。
* @param version 数据项的版本号。
*/
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {
// 处理新数据项的插入
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
mDiffDataValues.remove(DataColumns.ID); // 从差异中移除ID
}
mDiffDataValues.put(DataColumns.NOTE_ID, noteId); // 设置笔记ID
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); // 插入数据项
try {
mDataId = Long.valueOf(uri.getPathSegments().get(1)); // 从URI中获取新数据项的ID
} catch (NumberFormatException e) {
Log.e(TAG, "Get note id error :" + e.toString()); // 输出错误
throw new ActionFailureException("create note failed"); // 抛出异常表示创建失败
}
} else {
// 处理现有数据项的更新
if (mDiffDataValues.size() > 0) {
int result = 0;
if (!validateVersion) {
// 不验证版本号时直接更新
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
} else {
// 验证版本号时条件更新
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
" ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.VERSION + "=?)", new String[]{
String.valueOf(noteId), String.valueOf(version)
});
}
if (result == 0) {
Log.w(TAG, "there is no update. maybe user updates note when syncing"); // 输出警告
}
}
}
// 清理并重置状态
mDiffDataValues.clear(); // 清空差异数据
mIsCreate = false; // 设置为更新状态
}
/*
* 获取数据项的ID。
* @return 数据项的ID。
*/
public long getId() {
return mDataId; // 返回数据项ID
}
}