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

304 lines
18 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)
* 版权所有c2010 - 2011MiCode 开源社区www.micode.net
*
* Licensed under the Apache License, Version 2.0 (the "License");
* (根据 Apache License 2.0 版(“许可证”)获得许可;)
* 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
* 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;
// 包 net.micode.notes.gtask.data这个包的名字是 net.micode.notes.gtask.data。
import android.content.ContentResolver;
// 导入 android.content.ContentResolver导入 Android 的内容解析器类。)
import android.content.ContentUris;
// 导入 android.content.ContentUris导入 Android 的内容 URI 工具类。)
import android.content.ContentValues;
// 导入 android.content.ContentValues导入 Android 的内容值类。)
import android.content.Context;
// 导入 android.content.Context导入 Android 的上下文类。)
import android.database.Cursor;
// 导入 android.database.Cursor导入 Android 的数据库游标类。)
import android.net.Uri;
// 导入 android.net.Uri导入 Android 的统一资源标识符类。)
import android.util.Log;
// 导入 android.util.Log导入 Android 的日志工具类。)
import net.micode.notes.data.Notes;
// 导入 net.micode.notes.data.Notes导入来自 net.micode.notes.data 的 Notes 类。)
import net.micode.notes.data.Notes.DataColumns;
// 导入 net.micode.notes.data.Notes.DataColumns导入 Notes 类中的数据列类。)
import net.micode.notes.data.Notes.DataConstants;
// 导入 net.micode.notes.data.Notes.DataConstants导入 Notes 类中的数据常量类。)
import net.micode.notes.data.Notes.NoteColumns;
// 导入 net.micode.notes.data.Notes.NoteColumns导入 Notes 类中的笔记列类。)
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
// 导入 net.micode.notes.data.NotesDatabaseHelper.TABLE导入 Notes 数据库助手类中的表枚举。)
import net.micode.notes.gtask.exception.ActionFailureException;
// 导入 net.micode.notes.gtask.exception.ActionFailureException导入特定的异常类。
import org.json.JSONException;
// 导入 org.json.JSONException导入 JSON 处理的异常类。)
import org.json.JSONObject;
// 导入 org.json.JSONObject导入 JSON 对象类。)
public class SqlData {
// 公共类 SqlData定义一个名为 SqlData 的公共类。)
private static final String TAG = SqlData.class.getSimpleName();
// 私有静态最终字符串变量 TAG赋值为 SqlData 类的简单名称;(定义一个私有静态最终的字符串变量 TAG值为 SqlData 类的简单名称。)
private static final int INVALID_ID = -99999;
// 私有静态最终整型变量 INVALID_ID赋值为 -99999定义一个私有静态最终的整型变量 INVALID_ID值为 -99999。
public static final String[] PROJECTION_DATA = new String[] {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
// 公共静态最终字符串数组变量 PROJECTION_DATA定义一个公共静态最终的字符串数组变量 PROJECTION_DATA包含特定的数据列名称。
public static final int DATA_ID_COLUMN = 0;
// 公共静态最终整型变量 DATA_ID_COLUMN赋值为 0定义一个公共静态最终的整型变量 DATA_ID_COLUMN值为 0。
public static final int DATA_MIME_TYPE_COLUMN = 1;
// 公共静态最终整型变量 DATA_MIME_TYPE_COLUMN赋值为 1定义一个公共静态最终的整型变量 DATA_MIME_TYPE_COLUMN值为 1。
public static final int DATA_CONTENT_COLUMN = 2;
// 公共静态最终整型变量 DATA_CONTENT_COLUMN赋值为 2定义一个公共静态最终的整型变量 DATA_CONTENT_COLUMN值为 2。
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
// 公共静态最终整型变量 DATA_CONTENT_DATA_1_COLUMN赋值为 3定义一个公共静态最终的整型变量 DATA_CONTENT_DATA_1_COLUMN值为 3。
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
// 公共静态最终整型变量 DATA_CONTENT_DATA_3_COLUMN赋值为 4定义一个公共静态最终的整型变量 DATA_CONTENT_DATA_3_COLUMN值为 4。
private ContentResolver mContentResolver;
// 私有 ContentResolver 变量 mContentResolver定义一个私有变量 mContentResolver类型为 ContentResolver。
private boolean mIsCreate;
// 私有布尔型变量 mIsCreate定义一个私有布尔型变量 mIsCreate。
private long mDataId;
// 私有长整型变量 mDataId定义一个私有长整型变量 mDataId。
private String mDataMimeType;
// 私有字符串变量 mDataMimeType定义一个私有字符串变量 mDataMimeType。
private String mDataContent;
// 私有字符串变量 mDataContent定义一个私有字符串变量 mDataContent。
private long mDataContentData1;
// 私有长整型变量 mDataContentData1定义一个私有长整型变量 mDataContentData1。
private String mDataContentData3;
// 私有字符串变量 mDataContentData3定义一个私有字符串变量 mDataContentData3。
private ContentValues mDiffDataValues;
// 私有 ContentValues 变量 mDiffDataValues定义一个私有变量 mDiffDataValues类型为 ContentValues。
public SqlData(Context context) {
// 公共构造函数,接收 Context 参数;(定义一个公共构造函数,接收一个 Context 参数。)
mContentResolver = context.getContentResolver();
// 获取内容解析器;(将 context 的内容解析器赋值给 mContentResolver。
mIsCreate = true;
// 设置创建标志;(将 mIsCreate 设置为 true。
mDataId = INVALID_ID;
// 初始化数据 ID将 mDataId 初始化为 INVALID_ID。
mDataMimeType = DataConstants.NOTE;
// 初始化数据 MIME 类型;(将 mDataMimeType 初始化为 DataConstants.NOTE。
mDataContent = "";
// 初始化数据内容;(将 mDataContent 初始化为空字符串。)
mDataContentData1 = 0;
// 初始化数据内容数据 1将 mDataContentData1 初始化为 0。
mDataContentData3 = "";
// 初始化数据内容数据 3将 mDataContentData3 初始化为空字符串。)
mDiffDataValues = new ContentValues();
// 创建新的 ContentValues 对象;(创建一个新的 ContentValues 对象并赋值给 mDiffDataValues。
}
public SqlData(Context context, Cursor c) {
// 公共构造函数,接收 Context 和 Cursor 参数;(定义一个公共构造函数,接收一个 Context 参数和一个 Cursor 参数。)
mContentResolver = context.getContentResolver();
// 获取内容解析器;(将 context 的内容解析器赋值给 mContentResolver。
mIsCreate = false;
// 设置创建标志;(将 mIsCreate 设置为 false。
loadFromCursor(c);
// 从游标加载数据;(调用 loadFromCursor 方法,从传入的游标中加载数据。)
mDiffDataValues = new ContentValues();
// 创建新的 ContentValues 对象;(创建一个新的 ContentValues 对象并赋值给 mDiffDataValues。
}
private void loadFromCursor(Cursor c) {
// 私有方法 loadFromCursor接收 Cursor 参数;(定义一个私有方法 loadFromCursor接收一个 Cursor 参数。)
mDataId = c.getLong(DATA_ID_COLUMN);
// 获取数据 ID从游标中获取指定列的数据 ID并赋值给 mDataId。
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
// 获取数据 MIME 类型;(从游标中获取指定列的数据 MIME 类型,并赋值给 mDataMimeType。
mDataContent = c.getString(DATA_CONTENT_COLUMN);
// 获取数据内容;(从游标中获取指定列的数据内容,并赋值给 mDataContent。
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
// 获取数据内容数据 1从游标中获取指定列的数据内容数据 1并赋值给 mDataContentData1。
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
// 获取数据内容数据 3从游标中获取指定列的数据内容数据 3并赋值给 mDataContentData3。
}
public void setContent(JSONObject js) throws JSONException {
// 公共方法 setContent接收 JSONObject 参数;(定义一个公共方法 setContent接收一个 JSONObject 参数。)
long dataId = js.has(DataColumns.ID)? js.getLong(DataColumns.ID) : INVALID_ID;
// 获取数据 ID如果 JSONObject 中包含指定键,则获取对应的值作为数据 ID否则设置为 INVALID_ID。
if (mIsCreate || mDataId!= dataId) {
// 判断是否创建或数据 ID 不一致;(如果正在创建或者当前数据 ID 与新的数据 ID 不一致。)
mDiffDataValues.put(DataColumns.ID, dataId);
// 更新差异数据值;(将新的数据 ID 放入差异数据值的对应键中。)
}
mDataId = dataId;
// 更新数据 ID将 dataId 赋值给 mDataId。
String dataMimeType = js.has(DataColumns.MIME_TYPE)? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE;
// 获取数据 MIME 类型;(如果 JSONObject 中包含指定键,则获取对应的值作为数据 MIME 类型,否则设置为 DataConstants.NOTE。
if (mIsCreate ||!mDataMimeType.equals(dataMimeType)) {
// 判断是否创建或数据 MIME 类型不一致;(如果正在创建或者当前数据 MIME 类型与新的数据 MIME 类型不一致。)
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
// 更新差异数据值;(将新的数据 MIME 类型放入差异数据值的对应键中。)
}
mDataMimeType = dataMimeType;
// 更新数据 MIME 类型;(将 dataMimeType 赋值给 mDataMimeType。
String dataContent = js.has(DataColumns.CONTENT)? js.getString(DataColumns.CONTENT) : "";
// 获取数据内容;(如果 JSONObject 中包含指定键,则获取对应的值作为数据内容,否则设置为空字符串。)
if (mIsCreate ||!mDataContent.equals(dataContent)) {
// 判断是否创建或数据内容不一致;(如果正在创建或者当前数据内容与新的数据内容不一致。)
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
// 更新差异数据值;(将新的数据内容放入差异数据值的对应键中。)
}
mDataContent = dataContent;
// 更新数据内容;(将 dataContent 赋值给 mDataContent。
long dataContentData1 = js.has(DataColumns.DATA1)? js.getLong(DataColumns.DATA1) : 0;
// 获取数据内容数据 1如果 JSONObject 中包含指定键,则获取对应的值作为数据内容数据 1否则设置为 0。
if (mIsCreate || mDataContentData1!= dataContentData1) {
// 判断是否创建或数据内容数据 1 不一致;(如果正在创建或者当前数据内容数据 1 与新的数据内容数据 1 不一致。)
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
// 更新差异数据值;(将新的数据内容数据 1 放入差异数据值的对应键中。)
}
mDataContentData1 = dataContentData1;
// 更新数据内容数据 1将 dataContentData1 赋值给 mDataContentData1。
String dataContentData3 = js.has(DataColumns.DATA3)? js.getString(DataColumns.DATA3) : "";
// 获取数据内容数据 3如果 JSONObject 中包含指定键,则获取对应的值作为数据内容数据 3否则设置为空字符串。
if (mIsCreate ||!mDataContentData3.equals(dataContentData3)) {
// 判断是否创建或数据内容数据 3 不一致;(如果正在创建或者当前数据内容数据 3 与新的数据内容数据 3 不一致。)
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
// 更新差异数据值;(将新的数据内容数据 3 放入差异数据值的对应键中。)
}
mDataContentData3 = dataContentData3;
// 更新数据内容数据 3将 dataContentData3 赋值给 mDataContentData3。
}
public JSONObject getContent() throws JSONException {
// 公共方法 getContent定义一个公共方法 getContent。
if (mIsCreate) {
// 判断是否正在创建;(如果正在创建。)
Log.e(TAG, "it seems that we haven't created this in database yet");
// 输出错误日志;(打印错误日志,提示“看起来我们还没有在数据库中创建这个。”)
return null;
// 返回 null返回 null。
}
JSONObject js = new JSONObject();
// 创建新的 JSONObject 对象;(创建一个新的 JSONObject 对象。)
js.put(DataColumns.ID, mDataId);
// 设置数据 ID将 mDataId 放入 JSONObject 的对应键中。)
js.put(DataColumns.MIME_TYPE, mDataMimeType);
// 设置数据 MIME 类型;(将 mDataMimeType 放入 JSONObject 的对应键中。)
js.put(DataColumns.CONTENT, mDataContent);
// 设置数据内容;(将 mDataContent 放入 JSONObject 的对应键中。)
js.put(DataColumns.DATA1, mDataContentData1);
// 设置数据内容数据 1将 mDataContentData1 放入 JSONObject 的对应键中。)
js.put(DataColumns.DATA3, mDataContentData3);
// 设置数据内容数据 3将 mDataContentData3 放入 JSONObject 的对应键中。)
return js;
// 返回 JSONObject 对象;(返回创建好的 JSONObject 对象。)
}
public void commit(long noteId, boolean validateVersion, long version) {
// 公共方法 commit接收长整型、布尔型和长整型参数定义一个公共方法 commit接收一个长整型 noteId、一个布尔型 validateVersion 和一个长整型 version 参数。)
if (mIsCreate) {
// 判断是否正在创建;(如果正在创建。)
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
// 判断数据 ID 是否无效且差异数据值包含特定键;(如果数据 ID 无效且差异数据值中包含指定键。)
mDiffDataValues.remove(DataColumns.ID);
// 移除该键值对;(从差异数据值中移除该键值对。)
}
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
// 设置笔记 ID将 noteId 放入差异数据值的对应键中。)
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
// 插入数据;(向 Notes 的内容数据 URI 中插入差异数据值,获取返回的 URI。
try {
// 尝试执行以下代码块;(开始 try 代码块。)
mDataId = Long.valueOf(uri.getPathSegments().get(1));
// 获取数据 ID从返回的 URI 中获取数据 ID并赋值给 mDataId。
} catch (NumberFormatException e) {
// 如果发生数字格式异常,进入此代码块;(捕获 NumberFormatException 异常。)
Log.e(TAG, "Get note id error :" + e.toString());
// 输出错误日志;(打印错误日志,提示“获取笔记 ID 错误:”加上异常信息。)
throw new ActionFailureException("create note failed");
// 抛出异常
} else {
// 如果不是正在创建;(如果不是正在创建的状态。)
if (mDiffDataValues.size() > 0) {
// 如果差异数据值不为空;(如果差异数据值有内容。)
int result = 0;
// 初始化结果变量;(先把结果设为 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) {
// 如果更新结果为 0如果更新没有效果。
Log.w(TAG, "there is no update. maybe user updates note when syncing");
// 输出警告日志;(打印警告日志,提示可能是用户在同步时更新了笔记。)
}
}
}
mDiffDataValues.clear();
// 清空差异数据值;(把差异数据值清空。)
mIsCreate = false;
// 设置不是创建状态;(设置当前不是创建新数据的状态。)
public long getId() {
// 获取 ID 的方法;(定义一个获取数据 ID 的方法。)
return mDataId;
// 返回数据 ID返回当前的数据 ID。
}