From 15541a220901549368e7c6a28eed670a621e266c Mon Sep 17 00:00:00 2001 From: SheYu <2893251844@qq.com> Date: Mon, 25 Dec 2023 01:07:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + ...读、标注和维护报告文档 .docx | Bin 83924 -> 0 bytes .../java/net/micode/notes/data/Contact.java | 57 +++--- .../java/net/micode/notes/data/Notes.java | 169 ++---------------- .../notes/data/NotesDatabaseHelper.java | 137 ++++++++------ .../net/micode/notes/data/NotesProvider.java | 131 ++++++++------ 6 files changed, 207 insertions(+), 288 deletions(-) delete mode 100644 doc/实践模板-开源软件泛读、标注和维护报告文档 .docx diff --git a/.gitignore b/.gitignore index 97faf09..e3879fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /src/Notes/ /src/.idea/ +/src/Notes-master1/ /.idea/ diff --git a/doc/实践模板-开源软件泛读、标注和维护报告文档 .docx b/doc/实践模板-开源软件泛读、标注和维护报告文档 .docx deleted file mode 100644 index e0ac5df8bd5ae7561b8434b115be4920e5f60677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83924 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
    ;PEKH<^I8t$JpMv=B*VueP2Va zwYI8hSES;5_xfedbwEMMSxZDgFC%VlC~>*>B_%#Bv9wFnPq+k`V) zL6rZ!&vdORN2|ofls+aEK}Ff5)C@MYf=et~S=CYTwkMMxjwTuPIi#gRgR_+?k-<@` z;&)h&5|7CwIi=C~Ex5$G6En4hFY@x7g7j(GU#dn6bnbgQWL7WNUqdV;J*ujg`nJ|x z)h@w!e3cu^#5OcK1m)<4L7Fy*2okn|BV2IS!FrkUv$l^$INx;@Ch})|+)-)wXt~*Z@T8-)U_t0F!^PZ~h}g>e)mc;(!4NXrK?|_jL_^{>kqFzWknJ^;Z_yue=v{ z1gIa10LRw>G!>kmSili6$Di;&jQ>^1e{=-g2m34?;5{F}{lD|;nz;VdWMpmaU}f#_ z$9(Xwo}7LJANvi@3BdohK*P^hFwdWOLo0*-3cuY-d%++D0=n<}l~!bsn8wN8z~$HP_A3$Sr*aoW;Qveu`c=iRnd(1PV4?r1;;(t@ zzrue_zWWLPiuWh{Z>e~{;(wjo|A{vu{g?TFPxb!_{&k??Cm5aOPw+3p4!>&nwSW0j zgC5(T8vfSX{1yNAC-0wVAfO;l;Qv3j?C+00e}xNk{{{YExMhEDh5m|u;Qb5wpWHG; Rz=fa%;FjqK0IpD={|D sContactCache; - private static final String TAG = "Contact";//设置日志TAG标签 + private static final String TAG = "Contact"; - //查询联系人的SQL筛选语句 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 = '+')"; - //获取联系人 + /** + * @method getContact + * @description: + * @date: 2023/12/21 19:18 + * @author: WuShuxian + * @param: context + * @param: phoneNumber + * @return: String + */ public static String getContact(Context context, String phoneNumber) { - if(sContactCache == null) {/*如果缓存为空,就新建一个*/ + // + if(sContactCache == null) { sContactCache = new HashMap(); } - if(sContactCache.containsKey(phoneNumber)) {/*如果缓存中已经有该电话号码对应的联系人名字,就直接返回*/ + if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));//将电话号码转换为最小匹配模式,用于筛选 + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, new String [] { Phone.DISPLAY_NAME }, - selection,//使用筛选条件 + selection, new String[] { phoneNumber }, null); - if (cursor != null && cursor.moveToFirst()) {//如果找到了符合条件的联系人 + if (cursor != null && cursor.moveToFirst()) { try { - String name = cursor.getString(0);//获取联系人名字 - sContactCache.put(phoneNumber, name);//将电话号码和联系人名字添加到缓存中 - return name;//返回联系人名字 + String name = cursor.getString(0); + sContactCache.put(phoneNumber, name); + return name; } catch (IndexOutOfBoundsException e) { Log.e(TAG, " Cursor get string error " + e.toString()); return null; } finally { - cursor.close();//关闭游标 + cursor.close(); } - } else {/*没找到*/ + } else { Log.d(TAG, "No contact matched with number:" + phoneNumber); return null; } diff --git a/src/main/java/net/micode/notes/data/Notes.java b/src/main/java/net/micode/notes/data/Notes.java index aba2dbb..8762500 100644 --- a/src/main/java/net/micode/notes/data/Notes.java +++ b/src/main/java/net/micode/notes/data/Notes.java @@ -17,11 +17,17 @@ package net.micode.notes.data; import android.net.Uri; -//Notes类就定义了很多常量,是小米便签的数据库 +/** + * @Package: net.micode.notes.data + * @ClassName: Notes + * @Description: + * @Author: WuShuxian + * @CreateDate: 2023/12/21 19:32 + * @Version: 1.0 + */ public class Notes { public static final String AUTHORITY = "micode_notes"; public static final String TAG = "Notes"; - //三个type public static final int TYPE_NOTE = 0; public static final int TYPE_FOLDER = 1; public static final int TYPE_SYSTEM = 2; @@ -32,7 +38,6 @@ public class Notes { * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records */ - //不同种类的文件夹 public static final int ID_ROOT_FOLDER = 0; public static final int ID_TEMPARAY_FOLDER = -1; public static final int ID_CALL_RECORD_FOLDER = -2; @@ -48,12 +53,12 @@ public class Notes { public static final int TYPE_WIDGET_INVALIDE = -1; public static final int TYPE_WIDGET_2X = 0; public static final int TYPE_WIDGET_4X = 1; - //数据常量 包括普通note和call_note + public static class DataConstants { public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; } - //两个指针,一个找便签和文件夹,一个用来找数据 + /** * Uri to query all notes and folders */ @@ -62,201 +67,72 @@ public class Notes { /** * Uri to query data */ - public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); - //Notecolumns类,用于创建数据库的表头 + public interface NoteColumns { - //具体每一项都给了英文注释 - /** - * The unique ID for a row - *

    Type: INTEGER (long)

    - */ + public static final String ID = "_id"; - /** - * The parent's id for note or folder - *

    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 - *

    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 - *

    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 - *

    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 - *

    Type : INTEGER

    - */ public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - /** - * The gtask id - *

    Type : TEXT

    - */ public static final String GTASK_ID = "gtask_id"; - /** - * The version code - *

    Type : INTEGER (long)

    - */ public static final String VERSION = "version"; + } - public static final String PASSWORD = "password"; - - public static final String IMPORTANCE = "importance"; - }//便签的各种属性 - /* - * 便签数据在数据库中的表头 - */ 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. - *

    Type: Text

    - */ public static final String MIME_TYPE = "mime_type"; - /** - * The reference id to note that this data belongs to - *

    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"; - }//一个便签内部各种数据类型 + } 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; public static final int MODE_CHECK_LIST = 1; @@ -266,19 +142,12 @@ public class Notes { public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); - }//一种是文本textnote + } 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"; @@ -286,5 +155,5 @@ public class Notes { 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"); - }//另一种是通话类型的callnote + } } diff --git a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java index bedbf65..1f05bbf 100644 --- a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -16,22 +16,31 @@ package net.micode.notes.data; -import android.content.ContentValues; +import android.content.ContentValues;//就是用于保存一些数据(string boolean ...)信息,这些信息可以被数据库操作时使用。 import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteDatabase;//主要提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query()。配合content.values +import android.database.sqlite.SQLiteOpenHelper;//用来管理数据的创建和版本更新 import android.util.Log; -//引用了同一个包中的另一个子包Notes中一些接口 + import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; -//数据库操作 +/** + * @Package: net.micode.notes.data + * @ClassName: NotesDatabaseHelper + * @Description: 便签数据库操作底层实现 + * @Author: WuShuxian + * @CreateDate: 2023/12/21 19:46 + * @Version: 1.0 + */ public class NotesDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "note.db"; private static final int DB_VERSION = 4; - //接口两部分一个Note一个DATA + /** + * 接口,创建数据库表头 + */ public interface TABLE { public static final String NOTE = "note"; @@ -41,7 +50,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { private static final String TAG = "NotesDatabaseHelper"; private static NotesDatabaseHelper mInstance; - //基于NoteColumn创建一个NOTE_TABLE表格,并附上初始数据 + /** + * 便签的属性数据库 + */ private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -62,7 +73,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + ")"; - //主要基于datacolumn来创建DATA_TABLE + /** + * 便签的内容数据库 + */ private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + @@ -77,13 +90,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + ")"; - //这个数据是关于INDEX编号的 + private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; /** - * 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 "+ @@ -93,9 +106,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + " END"; - //移入note时触发,修改一系列数据,从哪来之类的 + /** - * 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 " + @@ -106,9 +119,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + " END"; - //移除Note时触发,与上面移入对应 + /** - * 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 " + @@ -118,9 +131,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + " END"; - //插入Note + /** - * 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 " + @@ -131,7 +144,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " AND " + NoteColumns.NOTES_COUNT + ">0;" + " END"; - //删除note + /** * Update note's content when insert data with type {@link DataConstants#NOTE} */ @@ -144,7 +157,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + " END"; - //当给note插入新数据时触发 + /** * Update note's content when data with {@link DataConstants#NOTE} type has changed */ @@ -156,7 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END";//note数据被修改update + " END"; /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted @@ -169,7 +182,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.SNIPPET + "=''" + " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END";//更新已经删除的便签的数据 + " END"; /** * Delete datas belong to note which has been deleted @@ -180,7 +193,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " BEGIN" + " DELETE FROM " + TABLE.DATA + " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " END";//删除 已经被删除的便签的数据 + " END"; /** * Delete notes belong to folder which has been deleted @@ -191,7 +204,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " BEGIN" + " DELETE FROM " + TABLE.NOTE + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//删除 已删除folder文件夹 中的便签要修改的数据 + " END"; /** * Move notes belong to folder which has been moved to trash folder @@ -204,12 +217,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//移动trash_folder中的便签 + " END"; public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } - //构造函数 + public void createNoteTable(SQLiteDatabase db) { db.execSQL(CREATE_NOTE_TABLE_SQL); reCreateNoteTableTriggers(db); @@ -233,49 +246,48 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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); - }//数据库操作的API,重新创建 - + } + /** + * @method createSystemFolder + * @description: 创建系统缺省文件夹:通话记录、缺省根目录、临时文件夹、回收文件夹 + * @date: 2023/12/21 20:19 + * @author: WuShuxian + * @param: db + * @return: void + */ private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); - /** - * call record foler 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 - */ + //缺省根目录 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); - }//创建系统文件夹 + } 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"); - }//创建数据表格 + } private void reCreateDataTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); @@ -285,38 +297,45 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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); - }//类似于recreatenotetable,重新创建触发器 + } static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } return mInstance; - }//sync同步,同一时刻只有一个线程执行 + } @Override public void onCreate(SQLiteDatabase db) { - createNoteTable(db); - createDataTable(db); - }//创建Note Data两个表格 - + createNoteTable(db);//属性数据库 + createDataTable(db);//内容数据库 + } + /** + * @method onUpgrade + * @description: 便签版本更新?没有使用者判断不了 + * @date: 2023/12/21 20:42 + * @author: WuShuxian + * @param: + * @return: + */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; boolean skipV2 = false; - + //V1->V2 if (oldVersion == 1) { upgradeToV2(db); skipV2 = true; // this upgrade including the upgrade from v2 to v3 oldVersion++; } - + //V2->V3 if (oldVersion == 2 && !skipV2) { upgradeToV3(db); reCreateTriggers = true; oldVersion++; } - + //V3->V4 if (oldVersion == 3) { upgradeToV4(db); oldVersion++; @@ -331,15 +350,19 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { throw new IllegalStateException("Upgrade notes database to version " + newVersion + "fails"); } - }//数据库版本更新 - + } + /** + * 升级到V2,修改相应数据库 + */ 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); - }//更新到V2 - + } + /** + * 升级到V3,修改相应数据库 + */ private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); @@ -353,10 +376,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); - }//更新到V3 - + } + /** + * 升级到V4,修改相应数据库 + */ private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); - }//更新到V4 + } } diff --git a/src/main/java/net/micode/notes/data/NotesProvider.java b/src/main/java/net/micode/notes/data/NotesProvider.java index 6897999..ddb2282 100644 --- a/src/main/java/net/micode/notes/data/NotesProvider.java +++ b/src/main/java/net/micode/notes/data/NotesProvider.java @@ -1,5 +1,22 @@ +/* + * 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; @@ -16,15 +33,19 @@ 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; -//为存储和获取数据提供接口。可以在不同的应用程序之间共享数据 -//ContentProvider提供的方法 -//query:查询 -//insert:插入 -//update:更新 -//delete:删除 -//getType:得到数据类型 + +/** + * @Package: net.micode.notes.data + * @ClassName: NotesProvider + * @Description: 为存储和获取数据提供接口。可以在不同的应用程序之间共享数据 + * @Author: WuShuxian + * @CreateDate: 2023/12/21 20:50 + * @Version: 1.0 + */ public class NotesProvider extends ContentProvider { - // UriMatcher用于匹配Uri + /** + * UriMatcher用于匹配Uri + */ private static final UriMatcher mMatcher; private NotesDatabaseHelper mHelper; @@ -40,9 +61,7 @@ public class NotesProvider extends ContentProvider { private static final int URI_SEARCH_SUGGEST = 6; static { - // 创建UriMatcher时,调用UriMatcher(UriMatcher.NO_MATCH)表示不匹配任何路径的返回码 mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - // 把需要匹配Uri路径全部给注册上 mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); @@ -53,43 +72,44 @@ 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. */ - // 声明 NOTES_SEARCH_PROJECTION 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; - // 声明NOTES_SNIPPET_SEARCH_QUERY + + 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; + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; @Override - // Context只有在onCreate()中才被初始化 - // 对mHelper进行实例化 public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } - + /** + * @Package: net.micode.notes.data + * @ClassName: NotesProvider + * @Description: 查询Uri在数据库中的位置 + * @Author: WuShuxian + * @CreateDate: 2023/12/21 21:06 + * @Version: 1.0 + */ @Override - // 查询uri在数据库中对应的位置 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { + String sortOrder) { Cursor c = null; - // 获取可读数据库 - SQLiteDatabase db = mHelper.getReadableDatabase(); + SQLiteDatabase db = mHelper.getReadableDatabase();//读数据库 String id = null; - // 匹配查找uri switch (mMatcher.match(uri)) { - // 对于不同的匹配值,在数据库中查找相应的条目 case URI_NOTE: c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); @@ -111,7 +131,6 @@ public class NotesProvider extends ContentProvider { 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"); } @@ -119,8 +138,6 @@ public class NotesProvider extends ContentProvider { String searchString = null; if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { if (uri.getPathSegments().size() > 1) { - // getPathSegments()方法得到一个String的List, - // 在uri.getPathSegments().get(1)为第2个元素 searchString = uri.getPathSegments().get(1); } } else { @@ -132,7 +149,7 @@ public class NotesProvider extends ContentProvider { } try { - searchString = String.format("%%%s%%", searchString); + searchString = String.format("%%%s%%", searchString);//在新建便签并输入内容保存后会跳到这里,暂时不知道为什么 c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[] { searchString }); } catch (IllegalStateException ex) { @@ -140,7 +157,6 @@ public class NotesProvider extends ContentProvider { } break; default: - // 抛出异常 throw new IllegalArgumentException("Unknown URI " + uri); } if (c != null) { @@ -149,18 +165,22 @@ public class NotesProvider extends ContentProvider { return c; } + /** + * @method insert + * @description: 插入一个Uri,只有新建便签并保存后才会触发,修改内容不会触发 + * @date: 2023/12/21 21:16 + * @author: WuShuxian + * @param: + * @return: + */ @Override - // 插入一个uri public Uri insert(Uri uri, ContentValues values) { - // 获得可写的数据库 SQLiteDatabase db = mHelper.getWritableDatabase(); long dataId = 0, noteId = 0, insertedId = 0; switch (mMatcher.match(uri)) { - // 新增一个条目 case URI_NOTE: insertedId = noteId = db.insert(TABLE.NOTE, null, values); break; - // 如果存在,查找NOTE_ID case URI_DATA: if (values.containsKey(DataColumns.NOTE_ID)) { noteId = values.getAsLong(DataColumns.NOTE_ID); @@ -173,7 +193,6 @@ public class NotesProvider extends ContentProvider { throw new IllegalArgumentException("Unknown URI " + uri); } // Notify the note uri - // notifyChange获得一个ContextResolver对象并且更新里面的内容 if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); @@ -185,17 +204,20 @@ public class NotesProvider extends ContentProvider { ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); } - // 返回插入的uri的路径 return ContentUris.withAppendedId(uri, insertedId); } - + /** + * @method delete + * @description: 删除一个Uri,删除便签时会触发 + * @date: 2023/12/21 21:17 + * @author: WuShuxian + * @param: + * @return: + */ @Override - // 删除一个uri public int delete(Uri uri, String selection, String[] selectionArgs) { - //Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 int count = 0; String id = null; - // 获得可写的数据库 SQLiteDatabase db = mHelper.getWritableDatabase(); boolean deleteData = false; switch (mMatcher.match(uri)) { @@ -204,7 +226,7 @@ public class NotesProvider extends ContentProvider { count = db.delete(TABLE.NOTE, selection, selectionArgs); break; case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); + id = uri.getPathSegments().get(1);//修改便签内容时会触发,原因不明 /** * ID that smaller than 0 is system folder which is not allowed to * trash @@ -237,9 +259,15 @@ public class NotesProvider extends ContentProvider { } return count; } - + /** + * @method update + * @description: 更新Uri,修改便签时会触发。期间会跳到delete中执行,原因不明 + * @date: 2023/12/21 21:19 + * @author: WuShuxian + * @param: + * @return: + */ @Override - // 更新一个uri public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; String id = null; @@ -279,12 +307,10 @@ public class NotesProvider extends ContentProvider { return count; } - // 将字符串解析成规定格式 private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } - //增加一个noteVersion private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -307,7 +333,6 @@ public class NotesProvider extends ContentProvider { sql.append(selectString); } - // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句 mHelper.getWritableDatabase().execSQL(sql.toString()); } @@ -317,4 +342,4 @@ public class NotesProvider extends ContentProvider { return null; } -} \ No newline at end of file +}