From 1de09c8a7b609451630a0a51215b4e580db80457 Mon Sep 17 00:00:00 2001 From: pbo4gpfre <482198539@qq.com> Date: Sat, 28 Dec 2024 15:34:31 +0800 Subject: [PATCH 1/5] ADD file via upload --- Contact.java | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 Contact.java diff --git a/Contact.java b/Contact.java new file mode 100644 index 0000000..125d202 --- /dev/null +++ b/Contact.java @@ -0,0 +1,104 @@ +/* + * 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.data; + +import android.content.Context; +import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Data; +import android.telephony.PhoneNumberUtils; +import android.util.Log; + +import java.util.HashMap; + +// Contact类负责处理与联系人信息获取相关的功能 +public class Contact { + // 用于缓存联系人电话号码和对应姓名的映射关系,提高查询效率 + private static HashMap sContactCache; + // 用于在日志输出中标识该类 + private static final String TAG = "Contact"; + + // 定义一个SQL查询选择条件字符串,用于查询联系人数据库中与指定电话号码匹配的记录 + // 这里使用了ContactsContract中的相关常量来构建复杂的查询条件 + // PHONE_NUMBERS_EQUAL函数用于比较电话号码 + // Data.MIMETYPE 限定数据类型为电话号码类型 + // Data.RAW_CONTACT_ID 用于关联查询,确保原始联系人ID在特定查询结果范围内 + private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + + "(SELECT raw_contact_id " + + " FROM phone_lookup" + + " WHERE min_match = '+')"; + + // 根据提供的上下文和电话号码,从联系人数据库中获取对应的联系人姓名 + public static String getContact(Context context, String phoneNumber) { + // 如果缓存尚未初始化,创建一个新的HashMap用于缓存联系人信息 + if (sContactCache == null) { + sContactCache = new HashMap(); + } + + // 检查缓存中是否已经存在该电话号码对应的联系人姓名 + // 如果存在,直接从缓存中返回该姓名,避免重复查询数据库 + if (sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber); + } + + // 将通用的查询选择条件中的“+”替换为根据给定电话号码生成的最小匹配格式 + // 以便构建针对该电话号码的具体查询条件 + String selection = CALLER_ID_SELECTION.replace("+", + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // 使用ContentResolver从联系人数据库中查询符合条件的记录 + // Data.CONTENT_URI 是联系人数据的URI + // 只请求返回Phone.DISPLAY_NAME这一列,即联系人的显示名称 + // selection 是构建好的查询条件 + // new String[]{phoneNumber} 是查询条件中的参数,即要查询的电话号码 + // null 表示不指定排序方式 + Cursor cursor = context.getContentResolver().query( + Data.CONTENT_URI, + new String[]{Phone.DISPLAY_NAME}, + selection, + new String[]{phoneNumber}, + null); + + // 如果查询结果不为空且游标能够移动到第一条记录(表示查询到了匹配的联系人) + if (cursor!= null && cursor.moveToFirst()) { + try { + // 从查询结果的第一条记录中获取联系人的显示名称 + String name = cursor.getString(0); + // 将查询到的电话号码和联系人姓名存入缓存,以便后续查询使用 + sContactCache.put(phoneNumber, name); + // 返回查询到的联系人姓名 + return name; + } catch (IndexOutOfBoundsException e) { + // 如果在获取字符串时发生索引越界异常(可能是查询结果结构与预期不符) + // 记录错误日志,包含异常信息 + Log.e(TAG, " Cursor get string error " + e.toString()); + // 返回null表示获取联系人姓名失败 + return null; + } finally { + // 无论是否发生异常,都要关闭游标,释放资源 + cursor.close(); + } + } else { + // 如果没有查询到匹配的联系人记录 + // 记录调试日志,说明没有找到与给定电话号码匹配的联系人 + Log.d(TAG, "No contact matched with number:" + phoneNumber); + // 返回null表示没有找到匹配的联系人姓名 + return null; + } + } +} \ No newline at end of file -- 2.34.1 From 0581050a92ebe964249d68e0bae72a16dbd40a2d Mon Sep 17 00:00:00 2001 From: pbo4gpfre <482198539@qq.com> Date: Sat, 28 Dec 2024 16:03:26 +0800 Subject: [PATCH 2/5] Delete 'Contact.java' --- Contact.java | 104 --------------------------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 Contact.java diff --git a/Contact.java b/Contact.java deleted file mode 100644 index 125d202..0000000 --- a/Contact.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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.data; - -import android.content.Context; -import android.database.Cursor; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.Data; -import android.telephony.PhoneNumberUtils; -import android.util.Log; - -import java.util.HashMap; - -// Contact类负责处理与联系人信息获取相关的功能 -public class Contact { - // 用于缓存联系人电话号码和对应姓名的映射关系,提高查询效率 - private static HashMap sContactCache; - // 用于在日志输出中标识该类 - private static final String TAG = "Contact"; - - // 定义一个SQL查询选择条件字符串,用于查询联系人数据库中与指定电话号码匹配的记录 - // 这里使用了ContactsContract中的相关常量来构建复杂的查询条件 - // PHONE_NUMBERS_EQUAL函数用于比较电话号码 - // Data.MIMETYPE 限定数据类型为电话号码类型 - // Data.RAW_CONTACT_ID 用于关联查询,确保原始联系人ID在特定查询结果范围内 - private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER - + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Data.RAW_CONTACT_ID + " IN " - + "(SELECT raw_contact_id " - + " FROM phone_lookup" - + " WHERE min_match = '+')"; - - // 根据提供的上下文和电话号码,从联系人数据库中获取对应的联系人姓名 - public static String getContact(Context context, String phoneNumber) { - // 如果缓存尚未初始化,创建一个新的HashMap用于缓存联系人信息 - if (sContactCache == null) { - sContactCache = new HashMap(); - } - - // 检查缓存中是否已经存在该电话号码对应的联系人姓名 - // 如果存在,直接从缓存中返回该姓名,避免重复查询数据库 - if (sContactCache.containsKey(phoneNumber)) { - return sContactCache.get(phoneNumber); - } - - // 将通用的查询选择条件中的“+”替换为根据给定电话号码生成的最小匹配格式 - // 以便构建针对该电话号码的具体查询条件 - String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); - // 使用ContentResolver从联系人数据库中查询符合条件的记录 - // Data.CONTENT_URI 是联系人数据的URI - // 只请求返回Phone.DISPLAY_NAME这一列,即联系人的显示名称 - // selection 是构建好的查询条件 - // new String[]{phoneNumber} 是查询条件中的参数,即要查询的电话号码 - // null 表示不指定排序方式 - Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, - new String[]{Phone.DISPLAY_NAME}, - selection, - new String[]{phoneNumber}, - null); - - // 如果查询结果不为空且游标能够移动到第一条记录(表示查询到了匹配的联系人) - if (cursor!= null && cursor.moveToFirst()) { - try { - // 从查询结果的第一条记录中获取联系人的显示名称 - String name = cursor.getString(0); - // 将查询到的电话号码和联系人姓名存入缓存,以便后续查询使用 - sContactCache.put(phoneNumber, name); - // 返回查询到的联系人姓名 - return name; - } catch (IndexOutOfBoundsException e) { - // 如果在获取字符串时发生索引越界异常(可能是查询结果结构与预期不符) - // 记录错误日志,包含异常信息 - Log.e(TAG, " Cursor get string error " + e.toString()); - // 返回null表示获取联系人姓名失败 - return null; - } finally { - // 无论是否发生异常,都要关闭游标,释放资源 - cursor.close(); - } - } else { - // 如果没有查询到匹配的联系人记录 - // 记录调试日志,说明没有找到与给定电话号码匹配的联系人 - Log.d(TAG, "No contact matched with number:" + phoneNumber); - // 返回null表示没有找到匹配的联系人姓名 - return null; - } - } -} \ No newline at end of file -- 2.34.1 From 0bc487206f133cf81584e59c8a08c3f9f3e80a2a Mon Sep 17 00:00:00 2001 From: pbo4gpfre <482198539@qq.com> Date: Sat, 28 Dec 2024 16:04:11 +0800 Subject: [PATCH 3/5] Delete 'MetaData.java' --- MetaData.java | 134 -------------------------------------------------- 1 file changed, 134 deletions(-) delete mode 100644 MetaData.java diff --git a/MetaData.java b/MetaData.java deleted file mode 100644 index f9b1d35..0000000 --- a/MetaData.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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.database.Cursor; -import android.util.Log; - -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - - -public class MetaData extends Task { -/* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - */ - private final static String TAG = MetaData.class.getSimpleName(); - - private String mRelatedGid = null; -/* - * 功能描述:设置数据,即生成元数据库 - * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 - * 参数注解: - */ - - public void setMeta(String gid, JSONObject metaInfo) { - try { - metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); -/* - * 将这对键值放入metaInfo这个jsonobject对象中 - */ - } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); -/* - * 输出错误信息 - */ - } - setNotes(metaInfo.toString()); - setName(GTaskStringUtils.META_NOTE_NAME); - } -/* - * 功能描述:获取相关联的Gid - */ - - public String getRelatedGid() { - return mRelatedGid; - } -/* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 - * Made By CuiCan - */ - - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } -/* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: - */ - - @Override - public void setContentByRemoteJSON(JSONObject js) { - super.setContentByRemoteJSON(js); - if (getNotes() != null) { - try { - JSONObject metaInfo = new JSONObject(getNotes().trim()); - mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); - } catch (JSONException e) { - Log.w(TAG, "failed to get related gid"); - /* - * 输出警告信息 - */ - mRelatedGid = null; - } - } - } - /* - * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - - @Override - public void setContentByLocalJSON(JSONObject js) { - // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); -/* - * 传递非法参数异常 - */ - } -/* - * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - - @Override - public JSONObject getLocalJSONFromContent() { - throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); -/* - * 传递非法参数异常 - * Made By Cui Can - */ - } -/* - * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - - @Override - public int getSyncAction(Cursor c) { - throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ - } -} -- 2.34.1 From 6f024aea60c8dcb9f68f4f9b50075be74ecedfac Mon Sep 17 00:00:00 2001 From: pbo4gpfre <482198539@qq.com> Date: Sat, 28 Dec 2024 16:04:16 +0800 Subject: [PATCH 4/5] Delete 'Node.java' --- Node.java | 332 ------------------------------------------------------ 1 file changed, 332 deletions(-) delete mode 100644 Node.java diff --git a/Node.java b/Node.java deleted file mode 100644 index 5f2a99a..0000000 --- a/Node.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * 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.database.Cursor; - -import org.json.JSONObject; - -/** - * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 - * 关键字:abstract - */ -public abstract class Node { - //定义了各种用于表征同步状态的常量 - public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) - - public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 - - public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 - - public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 - - public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 - - public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 - - public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 - - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 - - public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 - - private String mGid; - - private String mName; - - private long mLastModified;//记录最后一次修改时间 - - private boolean mDeleted;//表征是否被删除 - - public Node() { - mGid = null; - mName = ""; - mLastModified = 0; - mDeleted = false; - } - - public abstract JSONObject getCreateAction(int actionId); - - public abstract JSONObject getUpdateAction(int actionId); - - public abstract void setContentByRemoteJSON(JSONObject js); - - public abstract void setContentByLocalJSON(JSONObject js); - - public abstract JSONObject getLocalJSONFromContent(); - - public abstract int getSyncAction(Cursor c); - - public void setGid(String gid) { - this.mGid = gid; - } - - public void setName(String name) { - this.mName = name; - } - - public void setLastModified(long lastModified) { - this.mLastModified = lastModified; - } - - public void setDeleted(boolean deleted) { - this.mDeleted = deleted; - } - - public String getGid() { - return this.mGid; - } - - public String getName() { - return this.mName; - } - - public long getLastModified() { - return this.mLastModified; - } - - public boolean getDeleted() { - return this.mDeleted; - } - -} -2、SqlData.java -/* - * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 - * SqlData其实就是也就是所谓数据中的数据 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - -public class SqlData { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - * Made By CuiCan - */ - private static final String TAG = SqlData.class.getSimpleName(); - -private static final int INVALID_ID = -99999; -=为mDataId置初始值-99999 - - - /** - * 来自Notes类中定义的DataColumn中的一些常量 - */ - - // 集合了interface DataColumns中所有SF常量 - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - /** - * 以下五个变量作为sql表中5列的编号 - */ - 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; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - /* - * 功能描述:构造函数,用于初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID;//mDataId置初始值-99999 - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - - /* - * 功能描述:构造函数,初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - /* - * 功能描述:从光标处加载数据 - * 从当前的光标处将五列的数据加载到该类的对象 - * Made By CuiCan - */ - 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); - } - - - /* - * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - public void setContent(JSONObject js) throws JSONException { - //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - - /* - * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - 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(); - 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); - return js; - } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: - * Made By CuiCan - */ - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - 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; - } - - /* - * 功能描述:获取当前id - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - public long getId() { - return mDataId; - } -} \ No newline at end of file -- 2.34.1 From f6de908a262316b2930b2ba55c3ec01076f47f64 Mon Sep 17 00:00:00 2001 From: pm93kjxhr <2786791389@qq.com> Date: Mon, 30 Dec 2024 19:22:57 +0800 Subject: [PATCH 5/5] ADD file via upload --- 202201012009.docx | Bin 0 -> 19192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 202201012009.docx diff --git a/202201012009.docx b/202201012009.docx new file mode 100644 index 0000000000000000000000000000000000000000..d7c6f92c6d6add71a7067df12fc5a454d1602518 GIT binary patch literal 19192 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 MPX#d)`+fEQ0l^v9%K!iX literal 0 HcmV?d00001 -- 2.34.1