/* * 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; /** * GTask同步的核心抽象节点类 * 该类是所有GTask同步数据(如笔记、文件夹)的基类,定义了同步所需的通用属性(GID、名称、修改时间、删除标记)、 * 同步动作常量以及需要子类实现的抽象方法(JSON序列化/反序列化、同步动作判断等)。 * 作为抽象类,它封装了GTask同步的通用逻辑,子类需根据具体数据类型(笔记/文件夹)实现抽象方法,完成具体的同步逻辑。 * * @author MiCode Open Source Community * @date 2010-2011 */ public abstract class Node { // ====================== 同步动作常量 ====================== /** * 同步动作:无操作(数据一致,无需同步) */ public static final int SYNC_ACTION_NONE = 0; /** * 同步动作:向远程GTask添加数据(本地新增数据,需要同步到远程) */ public static final int SYNC_ACTION_ADD_REMOTE = 1; /** * 同步动作:向本地添加数据(远程GTask新增数据,需要同步到本地) */ public static final int SYNC_ACTION_ADD_LOCAL = 2; /** * 同步动作:删除远程GTask数据(本地删除数据,需要同步删除远程数据) */ public static final int SYNC_ACTION_DEL_REMOTE = 3; /** * 同步动作:删除本地数据(远程GTask删除数据,需要同步删除本地数据) */ public static final int SYNC_ACTION_DEL_LOCAL = 4; /** * 同步动作:更新远程GTask数据(本地数据修改,需要同步更新远程数据) */ public static final int SYNC_ACTION_UPDATE_REMOTE = 5; /** * 同步动作:更新本地数据(远程GTask数据修改,需要同步更新本地数据) */ 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; // ====================== 成员变量 ====================== /** * GTask的唯一标识ID(Gid),用于关联本地数据和远程GTask数据 */ private String mGid; /** * 节点名称(如笔记标题、文件夹名称) */ private String mName; /** * 最后修改时间戳(毫秒),用于判断数据是否需要同步(本地与远程时间对比) */ private long mLastModified; /** * 删除标记:true表示数据已被删除(本地或远程),需要同步删除操作 */ private boolean mDeleted; /** * 构造方法:初始化节点的默认属性 * Gid为null,名称为空字符串,最后修改时间为0,删除标记为false */ public Node() { mGid = null; mName = ""; mLastModified = 0; mDeleted = false; } // ====================== 抽象方法(子类需实现) ====================== /** * 获取创建动作的JSON对象(用于向远程GTask发送创建请求) * @param actionId 动作ID(标识本次创建动作的唯一ID) * @return 包含创建动作信息的JSONObject */ public abstract JSONObject getCreateAction(int actionId); /** * 获取更新动作的JSON对象(用于向远程GTask发送更新请求) * @param actionId 动作ID(标识本次更新动作的唯一ID) * @return 包含更新动作信息的JSONObject */ public abstract JSONObject getUpdateAction(int actionId); /** * 根据远程GTask的JSON数据设置节点内容(将远程数据同步到本地) * @param js 远程GTask返回的JSON数据对象 */ public abstract void setContentByRemoteJSON(JSONObject js); /** * 根据本地的JSON数据设置节点内容(本地数据序列化后的恢复) * @param js 本地存储的JSON数据对象 */ public abstract void setContentByLocalJSON(JSONObject js); /** * 从节点内容中获取本地JSON数据(将本地数据序列化为JSON,用于存储或同步) * @return 包含本地节点内容的JSONObject */ public abstract JSONObject getLocalJSONFromContent(); /** * 根据本地数据库的Cursor数据判断当前节点的同步动作类型 * 核心逻辑:对比本地数据和远程GTask数据的状态(新增、修改、删除),返回对应的同步动作常量 * @param c 本地数据库的Cursor对象(包含本地数据的状态信息) * @return 同步动作类型(对应SYNC_ACTION_*常量) */ public abstract int getSyncAction(Cursor c); // ====================== 成员变量的setter/getter方法 ====================== /** * 设置GTask的唯一标识ID(Gid) * @param gid 远程GTask的Gid字符串 */ public void setGid(String gid) { this.mGid = gid; } /** * 设置节点名称 * @param name 节点名称字符串(笔记标题/文件夹名称) */ public void setName(String name) { this.mName = name; } /** * 设置最后修改时间戳 * @param lastModified 最后修改时间(毫秒) */ public void setLastModified(long lastModified) { this.mLastModified = lastModified; } /** * 设置删除标记 * @param deleted true表示数据已被删除,false表示数据正常 */ public void setDeleted(boolean deleted) { this.mDeleted = deleted; } /** * 获取GTask的唯一标识ID(Gid) * @return Gid字符串,若未关联远程数据则返回null */ public String getGid() { return this.mGid; } /** * 获取节点名称 * @return 节点名称字符串 */ public String getName() { return this.mName; } /** * 获取最后修改时间戳 * @return 最后修改时间(毫秒) */ public long getLastModified() { return this.mLastModified; } /** * 获取删除标记 * @return true表示数据已被删除,false表示数据正常 */ public boolean getDeleted() { return this.mDeleted; } }