Type: INTEGER (long)
- */ - public static final String ID = "_id"; - - /** - * The parent's id for note or folder(笔记或文件夹的父级 ID) - *Type: INTEGER (long)
- */ - public static final String PARENT_ID = "parent_id"; - - /** - * Created data for note or folder(笔记或文件夹的创建日期) - *Type: INTEGER (long)
- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date(笔记或文件夹的最后修改日期) - *Type: INTEGER (long)
- */ - public static final String MODIFIED_DATE = "modified_date"; - - - /** - * Alert date(笔记或文件夹的提醒日期) - *Type: INTEGER (long)
- */ - public static final String ALERTED_DATE = "alert_date"; - - /** - * Folder's name or text content of note(笔记或文件夹的文本内容或名称) - *Type: TEXT
- */ - public static final String SNIPPET = "snippet"; - - /** - * Note's widget id(笔记所对应的桌面小部件 ID) - *Type: INTEGER (long)
- */ - public static final String WIDGET_ID = "widget_id"; - - /** - * Note's widget type(笔记所对应的桌面小部件类型) - *Type: INTEGER (long)
- */ - public static final String WIDGET_TYPE = "widget_type"; - - /** - * Note's background color's id(笔记的背景颜色 ID) - *Type: INTEGER (long)
- */ - public static final String BG_COLOR_ID = "bg_color_id"; - - /** - * For text note, it doesn't has attachment, for multi-media - * note, it has at least one attachment(笔记是否包含附件) - *Type: INTEGER
- */ - public static final String HAS_ATTACHMENT = "has_attachment"; - - /** - * Folder's count of notes(文件夹中笔记的数量) - *Type: INTEGER (long)
- */ - public static final String NOTES_COUNT = "notes_count"; - - /** - * The file type: folder or note(笔记类型,可以是文件夹或笔记) - *Type: INTEGER
- */ - public static final String TYPE = "type"; - - /** - * The last sync id(最后同步 ID) - *Type: INTEGER (long)
- */ - public static final String SYNC_ID = "sync_id"; - - /** - * Sign to indicate local modified or not(本地是否修改过) - *Type: INTEGER
- */ - public static final String LOCAL_MODIFIED = "local_modified"; - - /** - * Original parent id before moving into temporary folder(移动到临时文件夹之前的原始父级 ID) - *Type : INTEGER
- */ - public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - - /** - * The gtask id(Google 任务 ID) - *Type : TEXT
- */ - public static final String GTASK_ID = "gtask_id"; - - /** - * The version code(版本号) - *Type : INTEGER (long)
- */ - public static final String VERSION = "version"; - } - - /** - * 这个接口DataColumns定义了笔记应用程序中的笔记数据表格中所有列的常量, - * 而NotesColumns定义了笔记应用程序中的笔记数据表格中的特定列的常量。 - * 因此,DataColumns更通用,而NotesColumns更具体。 - * NotesColumns接口包含笔记的标题、正文和颜色等属性, - * 而DataColumns接口包含笔记数据表格中的通用列。 - * 在许多情况下,这两个接口将一起使用。所以重复的常量就不在做解释了。 - */ - public interface DataColumns { - /** - * The unique ID for a row - *Type: INTEGER (long)
- */ - public static final String ID = "_id"; - - /** - * The MIME type of the item represented by this row.(表示该行数据的MIME类型) - *Type: Text
- */ - public static final String MIME_TYPE = "mime_type"; - - /** - * The reference id to note that this data belongs to(表示该行数据所属的笔记的ID) - *Type: INTEGER (long)
- */ - public static final String NOTE_ID = "note_id"; - - /** - * Created data for note or folder - *Type: INTEGER (long)
- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date - *Type: INTEGER (long)
- */ - public static final String MODIFIED_DATE = "modified_date"; - - /** - * Data's content - *Type: TEXT
- */ - public static final String CONTENT = "content"; - - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *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"; - } - - /** - * 这是一个嵌套在NotePad类中的静态内部类TextNote。 - * 它实现了DataColumns接口,并定义了特定于文本笔记的常量和内容URI。 - * 与NotesColumns类似,TextNote还具有特定于文本笔记的常量, - * 例如MODE和MODE_CHECK_LIST,以及特定于文本笔记的内容类型和内容项类型常量。 - * 此外,TextNote还定义了用于访问文本笔记数据的内容URI,该URI指向ContentProvider的text_note表。 - */ - public static final class TextNote implements DataColumns { - /** - * 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;//MODE字段表示文本笔记的模式,可以是正常模式或者是带有任务清单的模式,类型为整数。它使用了接口中的DATA1字段来表示其存储值的列名。 - - public static final int MODE_CHECK_LIST = 1;//MODE_CHECK_LIST字段表示任务清单模式的值,为1。 - - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - //CONTENT_TYPE字段表示此数据的MIME类型,指示ContentProvider返回的数据类型。此处表示返回的是文本笔记列表。 - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - //CONTENT_ITEM_TYPE字段表示此数据的单个项目的MIME类型。 - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); - //CONTENT_URI字段表示此数据的URI地址。 - } - - /** - * 这是一个嵌套在Notes类中的静态内部类CallNote,实现了DataColumns接口。 - * CallNote定义了一些特定于电话记录的字段,如CALL_DATE(通话日期)和PHONE_NUMBER(电话号码), - * 并定义了ContentProvider使用的MIME类型和URI。 - */ - public static final class CallNote implements DataColumns { - /** - * Call date for this record(记录通话日期) - *Type: INTEGER (long)
- */ - public static final String CALL_DATE = DATA1; - //表示通话日期的列名,数据类型为long,存储在DATA1列中。 - /** - * Phone number for this record(记录通话号码) - *Type: TEXT
- */ - public static final String PHONE_NUMBER = DATA3; - //表示电话号码的列名,数据类型为String,存储在DATA3列中。 - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - //单条通话记录,用于指定MIME类型的常量 - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - //同上,多条通话记录 - - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); - //该类的内容URI,用于访问通话记录。 - } -} diff --git a/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java deleted file mode 100644 index d68f611..0000000 --- a/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java +++ /dev/null @@ -1,439 +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.ContentValues; -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -/** - * 这段代码定义了一个名为NotesDatabaseHelper的类,继承自SQLiteOpenHelper。 - * 在该类中定义了数据库名(DB_NAME)和数据库版本号(DB_VERSION), - * 并定义了一个内部接口TABLE,该接口中定义了NOTE和DATA两个常量,分别表示数据库中的两个表名。 - * 其中SQLiteOpenHelper是Android提供的用于管理SQLite数据库的类, - * 它提供了创建、更新、打开和关闭数据库的方法,同时它也能够在不同的版本之间管理数据库的迁移。 - */ -public class NotesDatabaseHelper extends SQLiteOpenHelper { - private static final String DB_NAME = "note.db"; - - private static final int DB_VERSION = 4; - - public interface TABLE { - public static final String NOTE = "note"; - - public static final String DATA = "data"; - } - - private static final String TAG = "NotesDatabaseHelper";//这一行代码定义了一个名为TAG的字符串常量,用于在调试时作为日志标签。 - /** - * 定义了一个静态变量mInstance,类型是NotesDatabaseHelper,并且标记为static, - * 表示这个变量是属于类的而不是实例的。 - * 在类被加载的时候,这个变量会被创建。这个变量的作用是在整个应用中只创建一个NotesDatabaseHelper实例, - * 这样可以避免在多个地方重复创建数据库连接和实例,提高应用的性能和效率。 - */ - private static NotesDatabaseHelper mInstance; - /** - * 这段代码定义了两个字符串常量 CREATE_NOTE_TABLE_SQL 和 CREATE_DATA_TABLE_SQL, - * 分别用于创建两个数据库表格:note 和 data。 - */ - private static final String CREATE_NOTE_TABLE_SQL = - "CREATE TABLE " + TABLE.NOTE + "(" + - NoteColumns.ID + " INTEGER PRIMARY KEY," +//笔记 ID,整数类型,作为主键 - NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +//父笔记 ID,整数类型,不为空,默认为 0 - NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +//提醒时间,整数类型,不为空,默认为 0 - NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +//背景颜色 ID,整数类型,不为空,默认为 0 - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +//创建时间,整数类型,不为空,默认为当前时间 - NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +//是否有附件,整数类型,不为空,默认为 0 - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +//修改时间,整数类型,不为空,默认为当前时间 - NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +//笔记数量,整数类型,不为空,默认为 0 - NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +//笔记概要,文本类型,不为空,默认为空字符串 - NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +//笔记类型,整数类型,不为空,默认为 0 - NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +//小部件 ID,整数类型,不为空,默认为 0 - NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +//小部件类型,整数类型,不为空,默认为 -1 - NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +//同步 ID,整数类型,不为空,默认为 0 - NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +//本地修改标识,整数类型,不为空,默认为 0 - NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +//原始父笔记 ID,整数类型,不为空,默认为 0 - NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +//Google 任务 ID,文本类型,不为空,默认为空字符串 - NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +//版本号,整数类型,不为空,默认为 0 - ")"; - - private static final String CREATE_DATA_TABLE_SQL = - "CREATE TABLE " + TABLE.DATA + "(" + - DataColumns.ID + " INTEGER PRIMARY KEY," +//数据 ID,整数类型,作为主键 - DataColumns.MIME_TYPE + " TEXT NOT NULL," +//MIME 类型,文本类型,不为空 - DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +//笔记 ID,整数类型,不为空,默认为 0 - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +//创建时间,整数类型,不为空,默认为当前时间 - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +//修改时间,整数类型,不为空,默认为当前时间 - DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +//数据内容,文本类型,不为空,默认为空字符串 - DataColumns.DATA1 + " INTEGER," + - DataColumns.DATA2 + " INTEGER," + - DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + - ")"; - /** - * 这是一个用于创建数据库索引的SQL语句,它将创建一个名为"note_id_index"的索引, - * 该索引将位于"TABLE.DATA"表上,并将使用"DataColumns.NOTE_ID"列作为索引键。 - * 这个索引的目的是在查询该表时提高性能,尤其是在根据笔记ID进行过滤时。如果索引已经存在,则不会重复创建。 - */ - private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = - "CREATE INDEX IF NOT EXISTS note_id_index ON " + - TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; -//以下是各种 SQLite 数据库的触发器,用于更新数据库 - /** - * Increase folder's note count when move note to the folder(移动笔记到文件夹时增加文件夹的笔记数) - */ - 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 + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * 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 " + - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + - " END"; - - /** - * 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 " + - " AFTER INSERT ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END"; - - /** - * Update note's content when insert data with type {@link DataConstants#NOTE}(插入DataConstants类型的数据时更新笔记的内容) - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = - "CREATE TRIGGER update_note_content_on_insert " + - " AFTER INSERT ON " + TABLE.DATA + - " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has changed(当DataConstants类型的数据发生更改时更新笔记的内容) - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER update_note_content_on_update " + - " AFTER UPDATE ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has deleted(删除DataConstants类型的数据时更新笔记的内容) - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = - "CREATE TRIGGER update_note_content_on_delete " + - " AFTER delete ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=''" + - " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.DATA + - " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.NOTE + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * 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 " + - " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * 这段代码是一个构造函数,用于创建一个NotesDatabaseHelper对象。这个对象是用于管理SQLite数据库的帮助类,可以用来创建、升级和管理数据库表格。 - * 构造函数有四个参数,分别是: - * Context context:上下文对象,用于访问应用程序的资源和环境。 - * String DB_NAME:数据库的名称。 - * CursorFactory factory:用于创建游标对象的工厂类,如果为null,则使用默认工厂。 - * int DB_VERSION:数据库的版本号,用于管理数据库的升级。 - */ - public NotesDatabaseHelper(Context context) { - super(context, DB_NAME, null, DB_VERSION); - } - - /** - * 该方法负责在数据库中创建笔记表。 - * 它执行SQL语句CREATE_NOTE_TABLE_SQL来创建表,然后调用reCreateNoteTableTriggers方法来重新创建与笔记表关联的触发器。 - * 然后,它通过调用createSystemFolder方法创建一个系统文件夹,并使用Log.d方法记录一条消息,以指示笔记表已经创建。 - */ - public void createNoteTable(SQLiteDatabase db) { - db.execSQL(CREATE_NOTE_TABLE_SQL); - reCreateNoteTableTriggers(db); - createSystemFolder(db); - Log.d(TAG, "note table has been created"); - } - - /** - * 该方法用于重新创建笔记表相关的触发器。 - * 它首先使用DROP TRIGGER语句删除所有已有的触发器,然后使用CREATE TRIGGER语句重新创建它们。 - * 这个方法是为了在升级数据库时使用,以便更新旧版本的触发器。 - * @param db - */ - 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"); - db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); - - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); - db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); - db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); - db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); - } - - /** - * 此方法在数据库中创建四个系统文件夹:通话记录文件夹、根文件夹、临时文件夹和废纸篓文件夹。 - * 该方法创建一个ContentValues对象,并为每个文件夹的ID和TYPE列添加值。 - * 然后,该方法使用SQLiteDatabase类的insert()方法将值插入笔记表中。 - * 系统文件夹的ID定义为Notes类中的常量。 - * 通话记录文件夹用于通话笔记,根文件夹是默认文件夹,临时文件夹用于移动笔记,废纸篓文件夹是移动已删除笔记的地方。 - */ - private void createSystemFolder(SQLiteDatabase db) { - ContentValues values = new ContentValues(); - - /** - * call record folder for call notes - */ - values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * root folder which is default folder(mo - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * temporary folder which is used for moving note - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * create trash folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - /** - * 此方法在数据库中创建数据表,并设置必要的触发器和索引。 - * 它将SQLiteDatabase类的实例作为参数,用于执行SQL语句以创建数据表、重新创建触发器和创建索引。 - * CREATE_DATA_TABLE_SQL常量保存用于创建数据表的SQL语句,该语句定义列及其数据类型。 - * 调用recreatedatabletriggers()方法来删除和重新创建与数据表关联的触发器,这将确保触发器是最新的模式更改。 - * CREATE_DATA_NOTE_ID_INDEX_SQL常量保存SQL语句,用于在数据表的NOTE ID列上创建索引, - * 这提高了在NOTE ID列上联接数据和NOTE表的查询的性能。最后,打印一条日志消息,指示数据表已经创建。 - */ - public void createDataTable(SQLiteDatabase db) { - db.execSQL(CREATE_DATA_TABLE_SQL); - reCreateDataTableTriggers(db); - db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); - Log.d(TAG, "data table has been created"); - } - - /** - * Recreatedatabletriggers方法用于删除用于在insert、update和delete上更新注释内容的现有触发器, - * 然后使用最新定义重新创建它们。 - * 以下是被删除的触发器:update_note_content_on_insert_content_on_update_note_content_on_delete, - * 这些是重新创建的触发器:data_update_note_content_on_insert_trigger data_update_trigger data_update_note_content_on_delete_trigger - * 这些触发器确保每当在数据表中创建、更新或删除笔记时,笔记表中的snippet字段都会被更新。 - */ - 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"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); - - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); - } - - /** - * 这是一个静态方法,它返回NotesDatabaseHelper类的单个实例。 - * 它将Context对象作为参数,并检查NotesDatabaseHelper的实例是否为null。 - * 如果实例为null,则创建NotesDatabaseHelper类的新实例并返回它。如果实例已经存在,则返回现有实例。 - * 该方法是同步的,以确保一次只有一个线程可以访问它,避免任何并发问题。 - */ - static synchronized NotesDatabaseHelper getInstance(Context context) { - if (mInstance == null) { - mInstance = new NotesDatabaseHelper(context); - } - return mInstance; - } - - /** - * 这是NotesDatabaseHelper类中onCreate()和onUpgrade()方法的实现。 - * 第一次创建数据库时调用onCreate()。 - * 它分别使用createNoteTable()和createDataTable()方法在数据库中创建Note和Data两个表。 - * 当数据库需要升级到较新版本时,将调用onUpgrade()。 - * 它首先检查数据库的旧版本,并执行必要的升级将其带到新版本。 - * 在这个实现中,有三个升级步骤:从版本1升级到版本2:这将删除现有的Note和数据表,并使用createNoteTable()和createDataTable()方法重新创建它们。 - * 从版本2升级到版本3:这将删除一些未使用的触发器,并向Note表添加一个新列gtask_id。它还为回收筒创建一个新的系统文件夹。 - * 从版本3升级到版本4:这将向注释表添加一个新的列版本。 - * 如果在升级步骤中删除了任何触发器,则调用reCreateNoteTableTriggers()和recreateDatabletriggers()方法来重新创建它们。 - * 如果升级因某种原因失败,将引发IllegalStateException。 - */ - @Override - public void onCreate(SQLiteDatabase db) { - createNoteTable(db); - createDataTable(db); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - boolean reCreateTriggers = false; - boolean skipV2 = false; - - if (oldVersion == 1) { - upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to v3 - oldVersion++; - } - - if (oldVersion == 2 && !skipV2) { - upgradeToV3(db); - reCreateTriggers = true; - oldVersion++; - } - - if (oldVersion == 3) { - upgradeToV4(db); - oldVersion++; - } - - if (reCreateTriggers) { - reCreateNoteTableTriggers(db); - reCreateDataTableTriggers(db); - } - - if (oldVersion != newVersion) { - throw new IllegalStateException("Upgrade notes database to version " + newVersion - + "fails"); - } - } - - private void upgradeToV2(SQLiteDatabase db) { - db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); - createNoteTable(db); - createDataTable(db); - } - - private void upgradeToV3(SQLiteDatabase db) { - // drop unused triggers - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // add a column for gtask id - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID - + " TEXT NOT NULL DEFAULT ''"); - // add a trash system folder - ContentValues values = new ContentValues(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - private void upgradeToV4(SQLiteDatabase db) { - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION - + " INTEGER NOT NULL DEFAULT 0"); - } -} diff --git a/app/src/main/java/net/micode/notes/data/NotesProvider.java b/app/src/main/java/net/micode/notes/data/NotesProvider.java deleted file mode 100644 index b833f94..0000000 --- a/app/src/main/java/net/micode/notes/data/NotesProvider.java +++ /dev/null @@ -1,308 +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.app.SearchManager; -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.R; -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 {//定义NotesProvider类,它继承自ContentProvider类 - private static final UriMatcher mMatcher;//声明UriMatcher实例 - - private NotesDatabaseHelper mHelper;//声明NotesDatabaseHelper实例用于匹配Uri,以确定请求的类型,例如是否是请求特定的数据项,或者是否是搜索建议请求。 - - private static final String TAG = "NotesProvider"; - - private static final int URI_NOTE = 1;//代表笔记数据的URI - private static final int URI_NOTE_ITEM = 2;//代表单个笔记数据的URI - private static final int URI_DATA = 3;//代表附加数据的URI - private static final int URI_DATA_ITEM = 4;//代表单个附加数据的URI - - private static final int URI_SEARCH = 5;//代表搜索请求的URI - private static final int URI_SEARCH_SUGGEST = 6;//代表搜索建议请求的URI - - static { - mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); - } - - /** - * 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. - */ - // 定义将在搜索结果中返回的列 - 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; - // 定义将执行以检索搜索结果的搜索查询 - 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;// 排除非笔记条目 - - @Override - public boolean onCreate() {// 获取数据库帮助类的实例 - mHelper = NotesDatabaseHelper.getInstance(getContext()); - return true; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - Cursor c = null;// 获取可读的数据库实例 - SQLiteDatabase db = mHelper.getReadableDatabase(); - String id = null; - switch (mMatcher.match(uri)) { - case URI_NOTE:// 查询所有笔记 - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_NOTE_ITEM:// 查询单个笔记 - id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_DATA:// 查询所有数据 - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_DATA_ITEM: // 查询单个数据 - id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_SEARCH: - case URI_SEARCH_SUGGEST:// 搜索笔记 - if (sortOrder != null || projection != null) { - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); - } - - String searchString = null; - if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { - if (uri.getPathSegments().size() > 1) { - searchString = uri.getPathSegments().get(1); - } - } else { - searchString = uri.getQueryParameter("pattern"); - } - - if (TextUtils.isEmpty(searchString)) { - return null; - } - - try {// 搜索所有匹配的笔记 - searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); - } catch (IllegalStateException ex) { - Log.e(TAG, "got exception: " + ex.toString()); - } - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - if (c != null) {// 设置通知URI,以便在数据更改时通知观察者 - c.setNotificationUri(getContext().getContentResolver(), uri); - } - return c; - } - - @Override - public Uri insert(Uri uri, ContentValues values) {// 获取可写的 SQLiteDatabase 对象 - SQLiteDatabase db = mHelper.getWritableDatabase();// 初始化三个变量,用于存储 note、data 和插入的记录的 ID - long dataId = 0, noteId = 0, insertedId = 0;// 根据传入的 Uri 进行匹配 - switch (mMatcher.match(uri)) { - case URI_NOTE:// 向 TABLE.NOTE 表中插入记录,并获取插入的记录的 ID - insertedId = noteId = db.insert(TABLE.NOTE, null, values); - break; - case URI_DATA: - if (values.containsKey(DataColumns.NOTE_ID)) {// 如果 ContentValues 包含 DataColumns.NOTE_ID 列 - noteId = values.getAsLong(DataColumns.NOTE_ID);// 获取 DataColumns.NOTE_ID 列的值 - } else { - Log.d(TAG, "Wrong data format without note id:" + values.toString()); - }//打印日志 - insertedId = dataId = db.insert(TABLE.DATA, null, values);// 向 TABLE.DATA 表中插入记录,并获取插入的记录的 ID - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri);// 抛出 IllegalArgumentException 异常 - } - // Notify the note uri - if (noteId > 0) { // 如果 noteId 大于 0,则通知 content resolver 对应的 Uri 对应的数据已经发生了变化 - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); - } - - // Notify the data uri - if (dataId > 0) {// 如果 dataId 大于 0,则通知 content resolver 对应的 Uri 对应的数据已经发生了变化 - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); - } - - return ContentUris.withAppendedId(uri, insertedId); // 返回插入的记录的 Uri - } - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean deleteData = false; - switch (mMatcher.match(uri)) {// 根据传入的 Uri 进行匹配 - case URI_NOTE:// 如果匹配到 URI_NOTE - selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 ";// 组合 selection 条件,以确保删除的是用户笔记,而不是系统文件夹 - count = db.delete(TABLE.NOTE, selection, selectionArgs);// 删除 TABLE.NOTE 表中符合条件的记录,并返回删除的数量 - break; - case URI_NOTE_ITEM: // 如果匹配到 URI_NOTE_ITEM - id = uri.getPathSegments().get(1);// 获取 Uri 中的 ID - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ - long noteId = Long.valueOf(id); - if (noteId <= 0) { // 如果 ID 小于等于 0,则直接跳出 switch 语句 - break; - } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs);// 删除 TABLE.NOTE 表中符合条件的记录,并返回删除的数量 - break; - case URI_DATA:// 如果匹配到 URI_DATA - count = db.delete(TABLE.DATA, selection, selectionArgs);// 删除 TABLE.DATA 表中符合条件的记录,并返回删除的数量 - deleteData = true; - break; - case URI_DATA_ITEM:// 如果匹配到 URI_DATA_ITEM - id = uri.getPathSegments().get(1); // 获取 Uri 中的 ID - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs);// 删除 TABLE.DATA 表中符合条件的记录,并返回删除的数量 - deleteData = true; - break; - default:// 如果无法匹配到 Uri - throw new IllegalArgumentException("Unknown URI " + uri);// 抛出 IllegalArgumentException 异常 - } - if (count > 0) {// 如果删除的数量大于 0 - if (deleteData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } // 如果删除的是 TABLE.DATA 表中的记录,则通知 content resolver 对应的 Uri 对应的笔记数据已经发生了变化 - getContext().getContentResolver().notifyChange(uri, null); - } - return count;// 返回删除的数量 - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int count = 0;// 受影响的行数 - String id = null;// 被更新的笔记或数据项的ID - SQLiteDatabase db = mHelper.getWritableDatabase();// 获取可写数据库 - boolean updateData = false;// 是否更新数据项 - - switch (mMatcher.match(uri)) {// 使用 switch 语句处理不同类型的 URI - case URI_NOTE: - increaseNoteVersion(-1, selection, selectionArgs);// 在更新前增加所有受影响的笔记的版本号 - count = db.update(TABLE.NOTE, values, selection, selectionArgs);// 更新数据库中的行并获取受影响的行数 - - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1);// 在更新前增加笔记的版本号 - increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); // 更新数据库中的行并获取受影响的行数 - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.update(TABLE.DATA, values, selection, selectionArgs); - updateData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - updateData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - // 如果有行被更新,通知已注册的 ContentObserver - if (count > 0) { - if (updateData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; // 返回受影响的行数 - } - // 辅助方法,如果传递了 selection 参数,则将其添加到 SQL 查询中 - 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 "); - sql.append(TABLE.NOTE); - sql.append(" SET "); - sql.append(NoteColumns.VERSION); - sql.append("=" + NoteColumns.VERSION + "+1 "); -// 如果传递了 ID 或 selection 参数,则将其添加到 SQL 查询中 - if (id > 0 || !TextUtils.isEmpty(selection)) { - sql.append(" WHERE "); - } - if (id > 0) { - sql.append(NoteColumns.ID + "=" + String.valueOf(id)); - } - if (!TextUtils.isEmpty(selection)) { - String selectString = id > 0 ? parseSelection(selection) : selection; - for (String args : selectionArgs) { - selectString = selectString.replaceFirst("\\?", args); - } - sql.append(selectString); - } - - mHelper.getWritableDatabase().execSQL(sql.toString());// 执行 SQL 查询以更新笔记的版本号 - } - - @Override - public String getType(Uri uri) { - // TODO Auto-generated method stub这是一个待办事项,需要根据 ContentProvider需求添加适当的 MIME类型。 - return null; - } - -} diff --git a/app/src/main/java/net/micode/notes/gtask/data/MetaData.java b/app/src/main/java/net/micode/notes/gtask/data/MetaData.java deleted file mode 100644 index 3a2050b..0000000 --- a/app/src/main/java/net/micode/notes/gtask/data/MetaData.java +++ /dev/null @@ -1,82 +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 { - private final static String TAG = MetaData.class.getSimpleName(); - - private String mRelatedGid = null; - - public void setMeta(String gid, JSONObject metaInfo) { - try { - 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); - } - - public String getRelatedGid() { - return mRelatedGid; - } - - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } - - @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; - } - } - } - - @Override - public void setContentByLocalJSON(JSONObject js) { - // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - } - - @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/app/src/main/java/net/micode/notes/gtask/data/Node.java b/app/src/main/java/net/micode/notes/gtask/data/Node.java deleted file mode 100644 index 63950e0..0000000 --- a/app/src/main/java/net/micode/notes/gtask/data/Node.java +++ /dev/null @@ -1,101 +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; - -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; - } - -} diff --git a/app/src/main/java/net/micode/notes/gtask/data/SqlData.java b/app/src/main/java/net/micode/notes/gtask/data/SqlData.java deleted file mode 100644 index d3ec3be..0000000 --- a/app/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ /dev/null @@ -1,189 +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.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; - - -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; - - 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; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID; - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - 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 { - 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; - } - - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - 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; - } - - 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; - } - - public long getId() { - return mDataId; - } -} diff --git a/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java deleted file mode 100644 index 79a4095..0000000 --- a/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ /dev/null @@ -1,505 +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.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; - - -public class SqlNote { - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - 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, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList`))jlv3Kr#7T8rx>Okb$?!JU{~mfU(lm15P=nCu-=n