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.

190 lines
11 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;//声名gtask下的data包
import android.content.ContentResolver;//引用android中content的几个类
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;//引用JSON使用失败异常处理类
import org.json.JSONObject;//引用JSON对象库类
public class SqlData {//定义数据库中基本数据类:读取数据、获取数据库中数据、提交数据到数据库
private static final String TAG = SqlData.class.getSimpleName();//调用getSimpleName()函数得到类的简写名称存入字符串TAG中
private static final int INVALID_ID = -99999;//将INVALID_ID初始化为-99999
public static final String[] PROJECTION_DATA = new String[] {//新建一个字符串数组集合了interface DataColumns中所有SF常量
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3//获得数据列idmime类型内容1类型数据3类型数据
};
public static final int DATA_ID_COLUMN = 0;//0号列的名称为DATA_ID_COLUMN
public static final int DATA_MIME_TYPE_COLUMN = 1;//1号列的名称为DATA_MIME_TYPE_COLUMN
public static final int DATA_CONTENT_COLUMN = 2;//2号列的名称为DATA_CONTENT_COLUMN
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;//3号列的名称为DATA_CONTENT_DATA_1_COLUMN
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;//4号列的名称为DATA_CONTENT_DATA_3_COLUMN
private ContentResolver mContentResolver;//定义私有全局变量
private boolean mIsCreate;//mIsCreate用于下文中选择SqlData的生成方式
private long mDataId;//数据ID号
private String mDataMimeType;//数据mime类型
private String mDataContent;//数据内容
private long mDataContentData1;//数据内容中的1类型数据
private String mDataContentData3;//数据内容中的3类型数据
private ContentValues mDiffDataValues;//mDiffDataValues用于构造SqiData操作数据库
public SqlData(Context context) {//构造函数初始化数据参数类型为Context
mContentResolver = context.getContentResolver();//获取ContentResovler对象如果需要查询数据可以直接在mContetResolver上操作
mIsCreate = true;//mIsCreate为TRUE是这种构造方式的标志
mDataId = INVALID_ID;//mDataId 置初始值-99999。
mDataMimeType = DataConstants.NOTE;//设置数据mime类型为note
mDataContent = "";//数据内容
mDataContentData1 = 0;//1数据类型
mDataContentData3 = "";//3数据类型
mDiffDataValues = new ContentValues();//创建内容
}
public SqlData(Context context, Cursor c) {//构造函数初始化数据参数类型分别为Context和Cursor
mContentResolver = context.getContentResolver();//获取ContentProvider提供的数据
mIsCreate = false;//记录当前数据创建方式
loadFromCursor(c);//从光标处载入数据
mDiffDataValues = new ContentValues();
}
private void loadFromCursor(Cursor c) {//从光标c处加载数据帮助实现SqlData的第二种构造将5列的数据赋给该类的对象
mDataId = c.getLong(DATA_ID_COLUMN);//调用cursor类的方法获取数据id参数为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);//1类型数据
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);//3类型数据
}
public void setContent(JSONObject js) throws JSONException {//设置共享数据并且抛出JSON类型的异常处理机制
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;//如果传入的JSONObject对象有DataColumns.ID这一项则设置dataID为这个ID否则设为INVALID_ID
if (mIsCreate || mDataId != dataId) {//如果采用的是第一种SqlData构造方式或者这个对象的ID不是共享数据ID
mDiffDataValues.put(DataColumns.ID, dataId);//将共享数据ID加入数据库中
}
mDataId = dataId;//共享数据同步后共享数据ID等于该数据ID
String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)//问号语句若json中有MIME_TYPE这一项则将其获取否则将其定义为notes类中定义的文本类型
: DataConstants.NOTE;
if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {//如果采用的是第一种SqlData构造方式或者这个对象的MimeType不和共享数据一样
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);//则将共享数据.MIME_TYPE加入数据库中
}
mDataMimeType = dataMimeType;//共享数据同步后共享数据mime类型等于该数据mime类型
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";//如果传入的JSONObject对象有DataColumn.CONTENT一项那么将其获取否则。将其设置为空
if (mIsCreate || !mDataContent.equals(dataContent)) {//如果是第一种sqldata函数或者该数据内容和共享数据内容不同
mDiffDataValues.put(DataColumns.CONTENT, dataContent);//那么就把这个数据内容添加到数据库这一数据内容列中
}
mDataContent = dataContent;//共享数据同步后,共享数据内容等于该数据内容
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;//如果js中有这一列1类型数据则将datacontentdata1设为这个数据 否则设为0
if (mIsCreate || mDataContentData1 != dataContentData1) {//如果是第一种sqldata函数或者该1类型数据和共享1类型数据不同
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);//那么就把这个1类型数据添加到数据库这一1类型数据列中
}
mDataContentData1 = dataContentData1;//共享数据同步后共享1类型数据等于该1类型数据
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";//如果js中有这一列3类型数据则将datacontentdata1设为这个数据 ,否则设为空
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {//如果是第一种sqldata函数或者该3类型数据和共享3类型数据不同
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);//那么就把这个3类型数据添加到数据库这一3类型数据列中
}
mDataContentData3 = dataContentData3;//共享数据同步后共享3类型数据等于该3类型数据
}
public JSONObject getContent() throws JSONException {//获取共享的数据内容并抛出json异常与处理机制
if (mIsCreate) {//当采用的是第一种SqlData构造方式时
Log.e(TAG, "it seems that we haven't created this in database yet");//在日志中显示错误“没有在数据库中创建这个数据”
return null;//返回null
}
JSONObject js = new JSONObject();//将相关数据放入新创建的JSONObject对象并返回
js.put(DataColumns.ID, mDataId);
js.put(DataColumns.MIME_TYPE, mDataMimeType);
js.put(DataColumns.CONTENT, mDataContent);
js.put(DataColumns.DATA1, mDataContentData1);
js.put(DataColumns.DATA3, mDataContentData3);//将JSON中放入数据这个JSON一共有五个数据对应着SqlData中的五行数据
return js;
}
public void commit(long noteId, boolean validateVersion, long version) {//commit函数把当前所做的修改保存到数据库
if (mIsCreate) {//当采用的是第一种SqlData构造方式时
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {ididid
mDiffDataValues.remove(DataColumns.ID);//则从共享数据中移除ID
}
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);//更新共享数据键为NOTE_ID值为noteId
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);//在note的资源标识下加入data数据并往URI中插入共享数据。
try {
mDataId = Long.valueOf(uri.getPathSegments().get(1));//获取有效便签id并创建
} catch (NumberFormatException e) {//处理异常
Log.e(TAG, "Get note id error :" + e.toString());//获取note id错误e.toString()获取异常类型和异常详细消息
throw new ActionFailureException("create note failed");//抛出异常“创建note失败”
}
} else {//当采用的是第二种SqlData构造方式时
if (mDiffDataValues.size() > 0) {
int result = 0;//若共享数据存在则通过内容解析器更新关于新URI的共享数据
if (!validateVersion) {//如果版本还没确认
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);//则结果记录下的只是data的ID还有data内容
} 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)
});//则从数据库中选取对应版本的id进行更新
}
if (result == 0)//{如果更新不存在(或许用户在同步时已经完成更新
Log.w(TAG, "there is no update. maybe user updates note when syncing");//报错
}
}
}
mDiffDataValues.clear();//回到初始化,清空,表示已经更新
mIsCreate = false;
}
public long getId() {
return mDataId;//获取当前id
}
}