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.
test123/SqlData.java

201 lines
9.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.
*/
// SqlData类用于处理与GTasks相关的数据操作
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
};
// 数据列的索引
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; // 数据内容中的DATA1字段
private String mDataContentData3;// 数据内容中的DATA3字段
private ContentValues mDiffDataValues; // 用于存储数据差异的ContentValues
// SqlData类的构造函数和成员方法用于处理GTasks数据
public SqlData(Context context) {
mContentResolver = context.getContentResolver(); // 初始化内容解析器
mIsCreate = true; // 标记为创建操作
mDataId = INVALID_ID; // 设置无效的数据ID
mDataMimeType = DataConstants.NOTE; // 默认MIME类型为笔记
mDataContent = "";// 默认内容为空字符串
mDataContentData1 = 0; // 默认DATA1字段为0
mDataContentData3 = ""; // 默认DATA3字段为空字符串
mDiffDataValues = new ContentValues(); // 初始化用于存储数据差异的ContentValues
}
// 基于Cursor的构造函数用于从Cursor加载数据
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver(); // 初始化内容解析器
mIsCreate = false; // 标记为非创建操作
loadFromCursor(c); // 从Cursor加载数据
mDiffDataValues = new ContentValues(); // 初始化用于存储数据差异的ContentValues
}
// 私有方法用于从Cursor加载数据到成员变量
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN); // 从Cursor获取数据ID
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); // 从Cursor获取MIME类型
mDataContent = c.getString(DATA_CONTENT_COLUMN); // 从Cursor获取内容
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); // 从Cursor获取DATA1字段
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); // 从Cursor获取DATA3字段
}
// 公共方法用于设置内容接收一个JSONObject作为参数
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; // 从JSONObject获取数据ID如果不存在则使用无效ID
// 如果是创建操作或者数据ID发生变化则更新差异数据
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId);
}
mDataId = dataId;// 更新数据ID
// 从JSONObject获取MIME类型如果不存在则使用默认笔记类型
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);
}
mDataMimeType = dataMimeType;// 更新MIME类型
// 从JSONObject获取内容如果不存在则使用空字符串
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
// 如果是创建操作或者内容发生变化,则更新差异数据
if (mIsCreate || !mDataContent.equals(dataContent)) {
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
} // 更新内容
mDataContent = dataContent;
// 从JSONObject获取DATA1字段如果不存在则使用0
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
// 如果是创建操作或者DATA1字段发生变化则更新差异数据
if (mIsCreate || mDataContentData1 != dataContentData1) {
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
} // 更新DATA1字段
mDataContentData1 = dataContentData1;// 更新成员变量中的DATA1字段值
// 从JSONObject获取DATA3字段如果不存在则使用空字符串
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
// 如果是创建操作或者DATA3字段值发生变化则更新差异数据
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {// 更新差异数据中的DATA3字段
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);// 更新成员变量中的DATA3字段值
}
mDataContentData3 = dataContentData3;
}
// 公共方法用于获取内容并返回一个JSONObject
public JSONObject getContent() throws JSONException {
// 如果是创建操作则记录错误并返回null
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
} // 创建一个新的JSONObject并填充数据
JSONObject js = new JSONObject();
js.put(DataColumns.ID, mDataId); // 添加数据ID
js.put(DataColumns.MIME_TYPE, mDataMimeType);// 添加MIME类型
js.put(DataColumns.CONTENT, mDataContent);// 添加内容
js.put(DataColumns.DATA1, mDataContentData1);// 添加DATA1字段
js.put(DataColumns.DATA3, mDataContentData3);// 添加DATA3字段
return js; // 返回填充好的JSONObject
}
// 公共方法,用于提交更改到数据库
public void commit(long noteId, boolean validateVersion, long version) {
// 如果是创建操作
if (mIsCreate) {
// 如果数据ID无效且差异数据中包含ID则移除ID
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
mDiffDataValues.remove(DataColumns.ID);
}
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);// 添加笔记ID到差异数据
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);// 插入新数据到数据库并获取Uri
// 尝试从Uri中获取新插入的数据ID
try {
mDataId = Long.valueOf(uri.getPathSegments().get(1));
} 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;
}
}