更新了标注

master
江一阳 2 years ago
parent 7ab2694acd
commit bbd6f55eb4

@ -16,7 +16,6 @@
package net.micode.notes.data;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentUris;
@ -34,21 +33,21 @@ import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
public class NotesProvider extends ContentProvider {
// 声明 UriMatcher用于匹配 Uri 和对应的操作
private static final UriMatcher mMatcher;
private NotesDatabaseHelper mHelper;
private static final String TAG = "NotesProvider";
// 声明 UriMatcher用于匹配 Uri 和对应的操作
private static final int URI_NOTE = 1;
private static final int URI_NOTE_ITEM = 2;
private static final int URI_DATA = 3;
private static final int URI_DATA_ITEM = 4;
private static final int URI_NOTE = 1;
private static final int URI_NOTE_ITEM = 2;
private static final int URI_DATA = 3;
private static final int URI_DATA_ITEM = 4;
private static final int URI_SEARCH = 5;
private static final int URI_SEARCH_SUGGEST = 6;
private static final int URI_SEARCH = 5;
private static final int URI_SEARCH_SUGGEST = 6;
static {
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
@ -62,29 +61,33 @@ public class NotesProvider extends ContentProvider {
}
/**
* x'0A' represents the '\n' character in sqlite. For title and content in the search result,
* x'0A' represents the '\n' character in sqlite. For title and content in the
* search result,
* we will trim '\n' and white space in order to show more information.
*/
// 声明 UriMatcher用于匹配 Uri 和对应的操作
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
+ NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
+ NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
// 声明常量,表示查询搜索建议的 SQL 语句
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
+ " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
+ " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
// 初始化 NotesProvider
@Override
public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext());
return true;
}
// 查询数据
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
@ -227,6 +230,7 @@ public class NotesProvider extends ContentProvider {
return count;
}
// 实现了更新数据的功能
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
@ -271,6 +275,16 @@ public class NotesProvider extends ContentProvider {
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
}
/**
*
* NoteNote1
*
* @param id NoteID-1Note
*
* @param selection
*
* @param selectionArgs
**/
private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
StringBuilder sql = new StringBuilder(120);
sql.append("UPDATE ");

@ -16,6 +16,7 @@
package net.micode.notes.gtask.data;
// 导入所需的类和包
import android.database.Cursor;
import android.util.Log;
@ -24,56 +25,70 @@ import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
// MetaData类继承自Task类用于处理与Google任务相关的元数据
public class MetaData extends Task {
// 定义类的TAG用于日志记录
private final static String TAG = MetaData.class.getSimpleName();
// 定义一个变量用于存储与Google任务相关的ID
private String mRelatedGid = null;
// 设置元数据方法接收一个gid和一个metaInfo JSONObject对象
public void setMeta(String gid, JSONObject metaInfo) {
try {
// 将gid存储在metaInfo的JSON对象中
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
} catch (JSONException e) {
// 记录错误日志
Log.e(TAG, "failed to put related gid");
}
// 记录错误日志
setNotes(metaInfo.toString());
// 设置元数据任务的名称
setName(GTaskStringUtils.META_NOTE_NAME);
}
// 获取与Google任务相关的ID的方法
public String getRelatedGid() {
return mRelatedGid;
}
// 重写isWorthSaving方法判断是否值得保存
@Override
public boolean isWorthSaving() {
return getNotes() != null;
}
// 从远程JSON设置内容
@Override
public void setContentByRemoteJSON(JSONObject js) {
super.setContentByRemoteJSON(js);
if (getNotes() != null) {
try {
// 解析notes中的JSON字符串
JSONObject metaInfo = new JSONObject(getNotes().trim());
// 从JSON对象中获取与Google任务相关的ID
mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
} catch (JSONException e) {
// 记录警告日志
Log.w(TAG, "failed to get related gid");
mRelatedGid = null;
}
}
}
// 从本地JSON设置内容但是不应该被调用因此抛出异常
@Override
public void setContentByLocalJSON(JSONObject js) {
// this function should not be called
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
// 从内容获取本地JSON但是不应该被调用因此抛出异常
@Override
public JSONObject getLocalJSONFromContent() {
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
// 获取同步操作,但是不应该被调用,因此抛出异常
@Override
public int getSyncAction(Cursor c) {
throw new IllegalAccessError("MetaData:getSyncAction should not be called");

@ -16,11 +16,14 @@
package net.micode.notes.gtask.data;
// 导入所需的类和包
import android.database.Cursor;
import org.json.JSONObject;
// 定义一个抽象类Node用于表示各种数据节点
public abstract class Node {
// 定义同步操作的常量
public static final int SYNC_ACTION_NONE = 0;
public static final int SYNC_ACTION_ADD_REMOTE = 1;
@ -38,7 +41,7 @@ public abstract class Node {
public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;
public static final int SYNC_ACTION_ERROR = 8;
// 定义节点的基本属性
private String mGid;
private String mName;
@ -47,6 +50,7 @@ public abstract class Node {
private boolean mDeleted;
// 构造方法,初始化节点的属性
public Node() {
mGid = null;
mName = "";
@ -54,18 +58,25 @@ public abstract class Node {
mDeleted = false;
}
// 定义抽象方法用于获取创建操作的JSON对象
public abstract JSONObject getCreateAction(int actionId);
// 定义抽象方法用于获取更新操作的JSON对象
public abstract JSONObject getUpdateAction(int actionId);
// 定义抽象方法用于根据远程JSON设置节点的内容
public abstract void setContentByRemoteJSON(JSONObject js);
// 定义抽象方法用于根据本地JSON设置节点的内容
public abstract void setContentByLocalJSON(JSONObject js);
// 定义抽象方法用于根据内容获取本地JSON
public abstract JSONObject getLocalJSONFromContent();
// 定义抽象方法,用于获取同步操作类型
public abstract int getSyncAction(Cursor c);
// 定义setter方法用于设置节点的属性
public void setGid(String gid) {
this.mGid = gid;
}
@ -82,6 +93,7 @@ public abstract class Node {
this.mDeleted = deleted;
}
// 定义getter方法用于获取节点的属性
public String getGid() {
return this.mGid;
}

@ -15,7 +15,7 @@
*/
package net.micode.notes.gtask.data;
// 导入所需的类和包
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
@ -34,12 +34,13 @@ import net.micode.notes.gtask.exception.ActionFailureException;
import org.json.JSONException;
import org.json.JSONObject;
// 定义一个名为SqlData的类用于表示SQL数据
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
@ -54,7 +55,7 @@ public class SqlData {
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;
@ -70,7 +71,7 @@ public class SqlData {
private String mDataContentData3;
private ContentValues mDiffDataValues;
// 构造方法,初始化类的属性
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;
@ -81,14 +82,14 @@ public class SqlData {
mDataContentData3 = "";
mDiffDataValues = new ContentValues();
}
// 基于现有的游标创建SqlData实例
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);
@ -96,7 +97,7 @@ public class SqlData {
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
// 从JSONObject设置内容
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
@ -129,7 +130,7 @@ public class SqlData {
}
mDataContentData3 = dataContentData3;
}
// 获取内容并将其转换为JSONObject
public JSONObject getContent() throws JSONException {
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
@ -143,7 +144,7 @@ public class SqlData {
js.put(DataColumns.DATA3, mDataContentData3);
return js;
}
// 提交更改到数据库
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {
@ -182,7 +183,7 @@ public class SqlData {
mDiffDataValues.clear();
mIsCreate = false;
}
// 获取数据ID
public long getId() {
return mDataId;
}

Loading…
Cancel
Save