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.
note/SqlData - 副本.java

195 lines
8.8 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.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;
/**
* SqlData类用于处理与数据库交互的笔记数据包括创建、读取和更新操作。
*/
public class SqlData {
private static final String TAG = SqlData.class.getSimpleName(); // 日志标签
private static final int INVALID_ID = -99999; // 无效 ID 常量
// 定义用于查询的数据列
public static final String[] PROJECTION_DATA = new String[] {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
// 数据列索引
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;
private ContentResolver mContentResolver; // 内容解析器,用于与内容提供者交互
private boolean mIsCreate; // 标识是否为新创建的数据
private long mDataId; // 数据 ID
private String mDataMimeType; // 数据 MIME 类型
private String mDataContent; // 数据内容
private long mDataContentData1; // 数据内容的附加信息 1
private String mDataContentData3; // 数据内容的附加信息 3
private ContentValues mDiffDataValues; // 存储待更新的内容值
// 构造函数,初始化 SqlData 实例(用于创建新数据)
public SqlData(Context context) {
mContentResolver = context.getContentResolver(); // 获取内容解析器
mIsCreate = true; // 设置为创建状态
mDataId = INVALID_ID; // 初始化数据 ID
mDataMimeType = DataConstants.NOTE; // 默认 MIME 类型
mDataContent = ""; // 初始化内容为空
mDataContentData1 = 0; // 初始化附加信息 1
mDataContentData3 = ""; // 初始化附加信息 3
mDiffDataValues = new ContentValues(); // 初始化待更新内容值
}
// 构造函数,初始化 SqlData 实例(从游标加载数据)
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver(); // 获取内容解析器
mIsCreate = false; // 设置为非创建状态
loadFromCursor(c); // 从游标加载数据
mDiffDataValues = new ContentValues(); // 初始化待更新内容值
}
// 从游标加载数据
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 对象加载数据
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 对象
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 对象
}
// 提交数据到数据库
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)); // 获取新创建的 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
public long getId() {
return mDataId; // 返回数据 ID
}
}