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

259 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.

/*
* 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();
// 定义一个无效的ID值用于表示未初始化或无效的ID
private static final int INVALID_ID = -99999;
// 定义一个投影数组,用于指定从数据库查询数据时需要返回的列
public static final String[] PROJECTION_DATA = new String[] {
DataColumns.ID, // 数据的ID
DataColumns.MIME_TYPE, // 数据的MIME类型
DataColumns.CONTENT, // 数据的内容
DataColumns.DATA1, // 数据的附加信息1
DataColumns.DATA3 // 数据的附加信息3
};
// 定义投影数组中数据ID列的索引
public static final int DATA_ID_COLUMN = 0;
// 定义投影数组中数据MIME类型列的索引
public static final int DATA_MIME_TYPE_COLUMN = 1;
// 定义投影数组中数据内容列的索引
public static final int DATA_CONTENT_COLUMN = 2;
// 定义投影数组中数据附加信息1列的索引
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
// 定义投影数组中数据附加信息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;
// 用于存储数据变更的ContentValues对象
private ContentValues mDiffDataValues;
// 构造函数用于创建一个新的SqlData对象通常用于创建新数据
public SqlData(Context context) {
// 获取上下文的ContentResolver对象
mContentResolver = context.getContentResolver();
// 标记为创建新数据
mIsCreate = true;
// 初始化数据ID为无效ID
mDataId = INVALID_ID;
// 初始化数据MIME类型为默认的笔记类型
mDataMimeType = DataConstants.NOTE;
// 初始化数据内容为空字符串
mDataContent = "";
// 初始化数据附加信息1为0
mDataContentData1 = 0;
// 初始化数据附加信息3为空字符串
mDataContentData3 = "";
// 初始化数据变更的ContentValues对象
mDiffDataValues = new ContentValues();
}
// 构造函数用于根据数据库游标创建一个SqlData对象通常用于从数据库加载现有数据
public SqlData(Context context, Cursor c) {
// 获取上下文的ContentResolver对象
mContentResolver = context.getContentResolver();
// 标记为非创建新数据,而是从现有数据加载
mIsCreate = false;
// 从游标中加载数据
loadFromCursor(c);
// 初始化数据变更的ContentValues对象
mDiffDataValues = new ContentValues();
}
// 从数据库游标中加载数据的私有方法
private void loadFromCursor(Cursor c) {
// 从游标中获取数据的ID
mDataId = c.getLong(DATA_ID_COLUMN);
// 从游标中获取数据的MIME类型
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
// 从游标中获取数据的内容
mDataContent = c.getString(DATA_CONTENT_COLUMN);
// 从游标中获取数据的附加信息1
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
// 从游标中获取数据的附加信息3
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
// 根据传入的JSONObject设置数据内容的方法可能会抛出JSONException异常
public void setContent(JSONObject js) throws JSONException {
// 从JSONObject中获取数据ID如果不存在则使用无效ID
long dataId = js.has(DataColumns.ID)? js.getLong(DataColumns.ID) : INVALID_ID;
// 如果是创建新数据或者当前数据ID与传入的ID不同
if (mIsCreate || mDataId!= dataId) {
// 将新的ID放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.ID, dataId);
}
// 更新当前数据的ID
mDataId = dataId;
// 从JSONObject中获取数据MIME类型如果不存在则使用默认的笔记类型
String dataMimeType = js.has(DataColumns.MIME_TYPE)? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE;
// 如果是创建新数据或者当前MIME类型与传入的不同
if (mIsCreate ||!mDataMimeType.equals(dataMimeType)) {
// 将新的MIME类型放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
}
// 更新当前数据的MIME类型
mDataMimeType = dataMimeType;
// 从JSONObject中获取数据内容如果不存在则使用空字符串
String dataContent = js.has(DataColumns.CONTENT)? js.getString(DataColumns.CONTENT) : "";
// 如果是创建新数据或者当前数据内容与传入的不同
if (mIsCreate ||!mDataContent.equals(dataContent)) {
// 将新的内容放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
}
// 更新当前数据的内容
mDataContent = dataContent;
// 从JSONObject中获取数据附加信息1如果不存在则使用0
long dataContentData1 = js.has(DataColumns.DATA1)? js.getLong(DataColumns.DATA1) : 0;
// 如果是创建新数据或者当前附加信息1与传入的不同
if (mIsCreate || mDataContentData1!= dataContentData1) {
// 将新的附加信息1放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
}
// 更新当前数据的附加信息1
mDataContentData1 = dataContentData1;
// 从JSONObject中获取数据附加信息3如果不存在则使用空字符串
String dataContentData3 = js.has(DataColumns.DATA3)? js.getString(DataColumns.DATA3) : "";
// 如果是创建新数据或者当前附加信息3与传入的不同
if (mIsCreate ||!mDataContentData3.equals(dataContentData3)) {
// 将新的附加信息3放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
}
// 更新当前数据的附加信息3
mDataContentData3 = dataContentData3;
}
// 获取当前数据内容的方法以JSONObject的形式返回可能会抛出JSONException异常
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();
// 将数据的ID放入JSONObject中
js.put(DataColumns.ID, mDataId);
// 将数据的MIME类型放入JSONObject中
js.put(DataColumns.MIME_TYPE, mDataMimeType);
// 将数据的内容放入JSONObject中
js.put(DataColumns.CONTENT, mDataContent);
// 将数据的附加信息1放入JSONObject中
js.put(DataColumns.DATA1, mDataContentData1);
// 将数据的附加信息3放入JSONObject中
js.put(DataColumns.DATA3, mDataContentData3);
// 返回包含数据内容的JSONObject
return js;
}
// 提交数据变更的方法,将数据插入或更新到数据库中
public void commit(long noteId, boolean validateVersion, long version) {
// 如果是创建新数据
if (mIsCreate) {
// 如果数据ID为无效ID且数据变更的ContentValues对象中包含ID移除该ID
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
mDiffDataValues.remove(DataColumns.ID);
}
// 将关联的笔记ID放入数据变更的ContentValues对象中
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
// 向内容提供者插入数据返回插入数据的Uri
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
try {
// 从Uri的路径段中获取插入数据的ID
mDataId = Long.valueOf(uri.getPathSegments().get(1));
} catch (NumberFormatException e) {
// 如果解析ID时发生数字格式异常记录错误日志并抛出异常
Log.e(TAG, "Get note id error :" + e.toString());
throw new ActionFailureException("create note failed");
}
} else {
// 如果数据变更的ContentValues对象中有数据需要更新
if (mDiffDataValues.size() > 0) {
int result = 0;
// 如果不需要验证版本
if (!validateVersion) {
// 更新数据库中指定ID的数据
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
} else {
// 更新数据库中指定ID的数据并验证版本
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)
});
}
// 如果更新结果为0说明没有数据被更新记录警告日志
if (result == 0) {
Log.w(TAG, "there is no update. maybe user updates note when syncing");
}
}
}
// 清空数据变更的ContentValues对象
mDiffDataValues.clear();
// 标记为非创建新数据
mIsCreate = false;
}
// 获取当前数据ID的方法
public long getId() {
return mDataId;
}
}