Type: INTEGER
+ */ public static final String DATA1 = "data1"; - + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * integer data type + *Type: INTEGER
+ */ public static final String DATA2 = "data2"; - + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *Type: TEXT
+ */ public static final String DATA3 = "data3"; - + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *Type: TEXT
+ */ public static final String DATA4 = "data4"; - + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *Type: TEXT
+ */ public static final String DATA5 = "data5"; } @@ -247,45 +246,34 @@ public class Notes { * Mode to indicate the text in check list mode or not *Type: Integer 1:check list mode 0: normal mode
*/ - //表示文本便签的形式,用于指示是否处于检查列表模式 public static final String MODE = DATA1; - //表示检查列表模式的常量值 public static final int MODE_CHECK_LIST = 1; - //定义了文本便签的内容类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - //定义了文本便签的单个项内容类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - //定义了文本便签的内容Uri public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } - public static final class CallNote implements DataColumns { /** * Call date for this record *Type: INTEGER (long)
*/ - //表示通话记录的日期 public static final String CALL_DATE = DATA1; /** * Phone number for this record *Type: TEXT
*/ - //表示通话记录的电话号码 public static final String PHONE_NUMBER = DATA3; - //定义了通话记录的内容类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - //定义了通话记录的单个项内容类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - //定义了通话记录的内容Uri public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); } } diff --git a/java/net/micode/notes/data/NotesDatabaseHelper.java b/java/net/micode/notes/data/NotesDatabaseHelper.java index 76c48e8..ffe5d57 100644 --- a/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -22,34 +22,26 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; -//对Notes类中DataColumns、DataConstants、NoteColumns进行引用: import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; public class NotesDatabaseHelper extends SQLiteOpenHelper { - //定义了数据库名称 private static final String DB_NAME = "note.db"; - //定义了数据库版本 private static final int DB_VERSION = 4; - //定义了TABLE接口 public interface TABLE { - //定义了两个表的名称 public static final String NOTE = "note"; public static final String DATA = "data"; } - //定义了标签 private static final String TAG = "NotesDatabaseHelper"; - //定义了一个静态变量mInstance,用于表示NotesDatabaseHelper类的实例 private static NotesDatabaseHelper mInstance; - //定义了SQL语句分别用于创建便签表、数据表、包含ID、便签和数据的表格 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -92,9 +84,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Increase folder's note count when move note to the folder - * 将笔记移动到文件夹时增加文件夹的笔记数 */ - //定义了对数据库进行增删改查等工作的SQL语句 private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update "+ " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + @@ -106,7 +96,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Decrease folder's note count when move note from folder - * 从文件夹中移动笔记时减少文件夹的笔记计数 */ private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update " + @@ -120,7 +109,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Increase folder's note count when insert new note to the folder - * 在文件夹中插入新笔记时增加文件夹的笔记数 */ private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert " + @@ -133,7 +121,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Decrease folder's note count when delete note from the folder - * 从文件夹中删除笔记时减少文件夹的笔记计数 */ private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete " + @@ -147,7 +134,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when insert data with type {@link DataConstants#NOTE} - * 插入类型为{DataConstants.Note}的数据时更新注释的内容 */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert " + @@ -161,7 +147,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has changed - * 当{DataConstants.Note}类型的数据发生更改时,更新注释的内容 */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + @@ -175,7 +160,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted - * 删除{DataConstants.Note}类型的数据后,更新注释的内容 */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete " + @@ -189,7 +173,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Delete datas belong to note which has been deleted - * 删除数据属于已删除的注释 */ private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete " + @@ -201,7 +184,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Delete notes belong to folder which has been deleted - * 删除数据属于已删除的注释 */ private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete " + @@ -213,7 +195,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Move notes belong to folder which has been moved to trash folder - * 移动笔记属于已移动到垃圾文件夹的文件夹 */ private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash " + @@ -229,19 +210,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { super(context, DB_NAME, null, DB_VERSION); } - //创建便签表 public void createNoteTable(SQLiteDatabase db) { - //执行创建表的SQL语句 db.execSQL(CREATE_NOTE_TABLE_SQL); - //重新创建表的触发器 reCreateNoteTableTriggers(db); - //创建系统文件夹 createSystemFolder(db); - //打印日志 Log.d(TAG, "note table has been created"); } - //重新创建便签表的触发器 private void reCreateNoteTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); @@ -260,7 +235,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } - //创建系统文件夹,包括通话记录文件夹、默认文件夹、临时文件夹和回收站文件夹。 private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); @@ -296,19 +270,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } - //创建数据表 public void createDataTable(SQLiteDatabase db) { - //执行创建表的SQL语句 db.execSQL(CREATE_DATA_TABLE_SQL); - //重新创建表的触发器 reCreateDataTableTriggers(db); - //创建数据表的索引 db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); - //打印日志 Log.d(TAG, "data table has been created"); } - //重新创建数据表的触发器 private void reCreateDataTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); @@ -319,7 +287,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); } - //获取NotesDatabaseHelper类的实例 static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); @@ -327,14 +294,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { return mInstance; } - //在数据库创建时调用,执行创建便签表和数据表的操作。 @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } - //在数据库升级时调用,根据旧版本和新版本执行相应的升级操作 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; @@ -368,7 +333,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { } } - //升级数据库到版本2的操作 private void upgradeToV2(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); @@ -376,7 +340,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createDataTable(db); } - //升级数据库到版本3的操作 private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); @@ -392,7 +355,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } - //升级数据库到版本4的操作 private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); diff --git a/java/net/micode/notes/data/NotesProvider.java b/java/net/micode/notes/data/NotesProvider.java index 93d8778..edb0a60 100644 --- a/java/net/micode/notes/data/NotesProvider.java +++ b/java/net/micode/notes/data/NotesProvider.java @@ -36,16 +36,12 @@ import net.micode.notes.data.NotesDatabaseHelper.TABLE; public class NotesProvider extends ContentProvider { - //UriMatcher对象,用于匹配URI并返回相应的整数值 private static final UriMatcher mMatcher; - //表示NotesDatabaseHelper的实例 private NotesDatabaseHelper mHelper; - //用于标识日志的标签 private static final String TAG = "NotesProvider"; - //定义了不同类型的URI匹配值 private static final int URI_NOTE = 1; private static final int URI_NOTE_ITEM = 2; private static final int URI_DATA = 3; @@ -69,7 +65,6 @@ public class NotesProvider extends ContentProvider { * 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. */ - //定义了搜索结果的投影,包括便签ID、额外数据、文本1、文本2、图标、意图操作和数据 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 + "," @@ -78,7 +73,6 @@ public class NotesProvider extends ContentProvider { + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; - //定义了搜索便签摘要的查询语句,用于从便签表中查询符合条件的便签摘要数据 private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + " FROM " + TABLE.NOTE + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" @@ -91,7 +85,6 @@ public class NotesProvider extends ContentProvider { return true; } - //处理查询操作,根据URI匹配不同的查询类型,包括便签、数据和搜索结果的查询。 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { @@ -154,7 +147,6 @@ public class NotesProvider extends ContentProvider { return c; } - //处理插入操作 @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = mHelper.getWritableDatabase(); @@ -189,7 +181,6 @@ public class NotesProvider extends ContentProvider { return ContentUris.withAppendedId(uri, insertedId); } - //处理删除操作 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; @@ -236,7 +227,6 @@ public class NotesProvider extends ContentProvider { return count; } - //处理更新操作 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; @@ -277,12 +267,10 @@ public class NotesProvider extends ContentProvider { return count; } - //辅助方法,用于解析查询条件 private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } - //辅助方法,用于增加便签版本号 private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -308,7 +296,6 @@ public class NotesProvider extends ContentProvider { mHelper.getWritableDatabase().execSQL(sql.toString()); } - //获取URI的MIME类型,暂未实现 @Override public String getType(Uri uri) { // TODO Auto-generated method stub diff --git a/java/net/micode/notes/gtask/data/MetaData.java b/java/net/micode/notes/gtask/data/MetaData.java index da1eaaa..3a2050b 100644 --- a/java/net/micode/notes/gtask/data/MetaData.java +++ b/java/net/micode/notes/gtask/data/MetaData.java @@ -24,58 +24,31 @@ 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(); - // 存储关联的Google Tasks ID 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; } - /* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 - */ @Override public boolean isWorthSaving() { return getNotes() != null; } - /* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: - */ @Override public void setContentByRemoteJSON(JSONObject js) { super.setContentByRemoteJSON(js); @@ -90,27 +63,20 @@ public class MetaData extends Task { } } - /* - * 功能描述:使用本地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"); } + } diff --git a/java/net/micode/notes/gtask/data/Node.java b/java/net/micode/notes/gtask/data/Node.java index 4d99f31..63950e0 100644 --- a/java/net/micode/notes/gtask/data/Node.java +++ b/java/net/micode/notes/gtask/data/Node.java @@ -21,24 +21,32 @@ import android.database.Cursor; import org.json.JSONObject; public abstract class Node { - // 同步动作常量(定义9种同步操作类型) 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; // Google Tasks ID或全局唯一标识 - private String mName; // 节点名称 - private long mLastModified; // 最后修改时间 - private boolean mDeleted; // 删除状态 + private String mGid; + + private String mName; + + private long mLastModified; + + private boolean mDeleted; - // 构造函数:初始化属性默认值 public Node() { mGid = null; mName = ""; @@ -46,21 +54,48 @@ public abstract class Node { mDeleted = false; } - // 抽象方法:由子类实现具体逻辑 - 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(); // 从内容生成本地JSON - public abstract int getSyncAction(Cursor c); // 获取同步动作类型 - - // 基础属性的getter和setter方法 - 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 mGid; } - public String getName() { return mName; } - public long getLastModified() { return mLastModified; } - public boolean getDeleted() { return mDeleted; } -} \ No newline at end of file + 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; + } + +} diff --git a/java/net/micode/notes/gtask/data/SqlData.java b/java/net/micode/notes/gtask/data/SqlData.java index 5013ca7..d3ec3be 100644 --- a/java/net/micode/notes/gtask/data/SqlData.java +++ b/java/net/micode/notes/gtask/data/SqlData.java @@ -37,31 +37,40 @@ import org.json.JSONObject; public class SqlData { private static final String TAG = SqlData.class.getSimpleName(); - private static final int INVALID_ID = -99999; // 无效ID标识 - // 数据库查询投影(指定查询的列) + 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 + 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; + 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; // 是否为新建状态 - private long mDataId; // 数据ID - private String mDataMimeType; // MIME类型 - private String mDataContent; // 数据内容 - private long mDataContentData1; // 附加数据1(长整型) - private String mDataContentData3; // 附加数据3(字符串) - private ContentValues mDiffDataValues; // 记录变更的ContentValues - - // 构造函数:初始化新对象 + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + 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; @@ -73,15 +82,13 @@ public class SqlData { mDiffDataValues = new ContentValues(); } - // 从Cursor加载数据的构造函数 public SqlData(Context context, Cursor c) { mContentResolver = context.getContentResolver(); mIsCreate = false; - loadFromCursor(c); // 从游标加载数据 + loadFromCursor(c); mDiffDataValues = new ContentValues(); } - // 从Cursor加载数据的辅助方法 private void loadFromCursor(Cursor c) { mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); @@ -90,16 +97,13 @@ public class SqlData { mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - // 根据JSON设置数据内容,并记录变更 public void setContent(JSONObject js) throws JSONException { - // 解析ID long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; - // 解析MIME类型 String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) : DataConstants.NOTE; if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { @@ -107,21 +111,18 @@ public class SqlData { } mDataMimeType = dataMimeType; - // 解析内容 String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; if (mIsCreate || !mDataContent.equals(dataContent)) { mDiffDataValues.put(DataColumns.CONTENT, dataContent); } mDataContent = dataContent; - // 解析附加数据1 long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; if (mIsCreate || mDataContentData1 != dataContentData1) { mDiffDataValues.put(DataColumns.DATA1, dataContentData1); } mDataContentData1 = dataContentData1; - // 解析附加数据3 String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { mDiffDataValues.put(DataColumns.DATA3, dataContentData3); @@ -129,10 +130,9 @@ public class SqlData { mDataContentData3 = dataContentData3; } - // 将对象数据转换为JSON public JSONObject getContent() throws JSONException { if (mIsCreate) { - Log.e(TAG, "数据未创建到数据库中"); + Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } JSONObject js = new JSONObject(); @@ -144,52 +144,46 @@ public class SqlData { return js; } - // 提交数据到数据库(插入或更新) public void commit(long noteId, boolean validateVersion, long version) { + if (mIsCreate) { - // 新建数据时移除无效ID,并添加noteId关联 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.parseLong(uri.getPathSegments().get(1)); + mDataId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { - Log.e(TAG, "获取ID失败", e); - throw new ActionFailureException("创建笔记失败"); + 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); + 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)}); + 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, "更新失败,可能同步时用户已修改笔记"); + Log.w(TAG, "there is no update. maybe user updates note when syncing"); } } } - // 清空变更记录,并标记为非新建状态 + mDiffDataValues.clear(); mIsCreate = false; } - // 获取数据ID public long getId() { return mDataId; } -} \ No newline at end of file +} diff --git a/java/net/micode/notes/gtask/data/SqlNote.java b/java/net/micode/notes/gtask/data/SqlNote.java index d4a9d21..79a4095 100644 --- a/java/net/micode/notes/gtask/data/SqlNote.java +++ b/java/net/micode/notes/gtask/data/SqlNote.java @@ -38,37 +38,11 @@ import org.json.JSONObject; import java.util.ArrayList; -import android.appwidget.AppWidgetManager; -import android.content.ContentResolver; -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.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.tool.ResourceParser; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - -/* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - */ public class SqlNote { private static final String TAG = SqlNote.class.getSimpleName(); private static final int INVALID_ID = -99999; - // 集合了interface DataColumns中所有SF常量 public static final String[] PROJECTION_NOTE = new String[] { NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, @@ -78,9 +52,6 @@ public class SqlNote { NoteColumns.VERSION }; - /* - * 以下五个变量作为sql表中5列的编号 - */ public static final int ID_COLUMN = 0; public static final int ALERTED_DATE_COLUMN = 1; @@ -118,7 +89,7 @@ public class SqlNote { private Context mContext; private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false + private boolean mIsCreate; private long mId; @@ -172,13 +143,6 @@ public class SqlNote { mDataList = new ArrayList`))jlv3Kr#7T8rx>Okb$?!JU{~mfU(lm15P=nCu-=n