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.
ReadMiNotes/标注/SqlData.java

246 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;
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;
// 数据内容1
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
// 数据内容3
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
// 内容解析器
private ContentResolver mContentResolver;
// 是否创建
private boolean mIsCreate;
// 数据ID
private long mDataId;
// 数据类型
private String mDataMimeType;
// 数据内容
private String mDataContent;
private long mDataContentData1;
// 数据内容
private String mDataContentData3;
// 差值数据
private ContentValues mDiffDataValues;
public SqlData(Context context) {
//获取内容解析器
mContentResolver = context.getContentResolver();
//标识是否创建
mIsCreate = true;
//数据ID
mDataId = INVALID_ID;
//数据类型
mDataMimeType = DataConstants.NOTE;
//数据内容
mDataContent = "";
//数据内容数据1
mDataContentData1 = 0;
//数据内容数据3
mDataContentData3 = "";
//差异数据值
mDiffDataValues = new ContentValues();
}
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);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
mDataContent = c.getString(DATA_CONTENT_COLUMN);
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
public void setContent(JSONObject js) throws JSONException {
// 从JSONObject中设置数据
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId);
}
mDataId = dataId;
// private void initDataMimeType(JSONObject js) {
// // 从JSONObject中获取MIME_TYPE
String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE;
// // 如果mIsCreate为true或者mDataMimeType不等于dataMimeType
if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
// // 将dataMimeType放入mDiffDataValues中
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
}
// // 将dataMimeType赋值给mDataMimeType
mDataMimeType = dataMimeType;
// 获取js中的内容
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
// 判断是否创建或者内容是否改变
if (mIsCreate || !mDataContent.equals(dataContent)) {
// 将内容添加到不同的数据值中
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
}
// 更新数据内容
mDataContent = dataContent;
// 获取dataContent的data1
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
// 如果mIsCreate为true或者dataContentData1不等于mDataContentData1则将dataContentData1放入mDiffDataValues中
if (mIsCreate || mDataContentData1 != dataContentData1) {
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
}
// 将dataContentData1赋值给mDataContentData1
mDataContentData1 = dataContentData1;
// 获取dataContent的data3
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
// 如果mIsCreate为true或者dataContentData3不等于mDataContentData3则将dataContentData3放入mDiffDataValues中
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
}
// 将dataContentData3赋值给mDataContentData3
mDataContentData3 = dataContentData3;
}
//获取内容
//获取内容
public JSONObject getContent() throws JSONException {
//判断是否创建
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
}
//创建JSONObject
JSONObject js = new JSONObject();
//添加ID
js.put(DataColumns.ID, mDataId);
//添加MIME_TYPE
js.put(DataColumns.MIME_TYPE, mDataMimeType);
//添加CONTENT
js.put(DataColumns.CONTENT, mDataContent);
//添加DATA1
js.put(DataColumns.DATA1, mDataContentData1);
//添加DATA3
js.put(DataColumns.DATA3, mDataContentData3);
//返回JSONObject
return js;
}
public void commit(long noteId, boolean validateVersion, long version) {
// 判断是否是创建操作
if (mIsCreate) {
// 如果数据ID为无效ID并且数据值中包含ID
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
// 移除ID
mDiffDataValues.remove(DataColumns.ID);
}
// 添加noteId
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
// 插入数据
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
try {
// 获取插入数据的ID
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;
}
public long getId() {
return mDataId;
}
}