diff --git a/MiNote/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/MiNote/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
index 1f4e4f2..d46a0d8 100644
--- a/MiNote/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
+++ b/MiNote/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
@@ -299,6 +299,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
Log.d(TAG, "data table has been created");
}
+ // 同上文的execSQL
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");
@@ -309,6 +310,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
}
+ /*
+ * 为解决同一时刻只能有一个线程执行
+ * 在写程序库代码时,有时一个类需要杯所有的其他类使用
+ * 但又要求这个类只能被实例化一次,是一个服务类,定义一次,其他类使用此类的同一个实例
+ */
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
@@ -316,12 +322,14 @@ 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;
@@ -355,6 +363,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
}
}
+ // 更新到V2版本
private void upgradeToV2(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);
@@ -362,6 +371,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
createDataTable(db);
}
+ // 更新到V3版本
private void upgradeToV3(SQLiteDatabase db) {
// drop unused triggers
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
@@ -377,6 +387,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.insert(TABLE.NOTE, null, values);
}
+ // 更新到V4版本
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
diff --git a/MiNote/app/src/main/java/net/micode/notes/data/NotesProvider.java b/MiNote/app/src/main/java/net/micode/notes/data/NotesProvider.java
index edb0a60..c0e372c 100644
--- a/MiNote/app/src/main/java/net/micode/notes/data/NotesProvider.java
+++ b/MiNote/app/src/main/java/net/micode/notes/data/NotesProvider.java
@@ -25,6 +25,7 @@ import android.content.Intent;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+// Uri代表所要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -33,10 +34,18 @@ 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:得到数据类型
+* */
public class NotesProvider extends ContentProvider {
- private static final UriMatcher mMatcher;
+ private static final UriMatcher mMatcher;// UriMatcher用于匹配Uri
private NotesDatabaseHelper mHelper;
@@ -51,7 +60,9 @@ 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);
@@ -65,6 +76,7 @@ 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 + ","
@@ -73,25 +85,32 @@ public class NotesProvider extends ContentProvider {
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
+ //声明NOTES_SNIPPET_SEARCH_QUERY
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;
+ // Context只用在onCreate()中才能被初始化
+ // 对mHelper进行实例化
@Override
public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext());
return true;
}
+ // 查询Uri在数据库中对应的位置
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Cursor c = null;
+ // 获取可读数据库
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);
@@ -113,6 +132,7 @@ 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");
}
@@ -120,6 +140,8 @@ 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)为第二个元素
searchString = uri.getPathSegments().get(1);
}
} else {
@@ -139,6 +161,7 @@ public class NotesProvider extends ContentProvider {
}
break;
default:
+ // 抛出未知uri的异常
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (c != null) {
@@ -148,14 +171,18 @@ public class NotesProvider extends ContentProvider {
}
@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;
case URI_DATA:
+ // 如果存在,查找NOTE_ID
if (values.containsKey(DataColumns.NOTE_ID)) {
noteId = values.getAsLong(DataColumns.NOTE_ID);
} else {
@@ -167,6 +194,7 @@ 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);
@@ -178,13 +206,16 @@ public class NotesProvider extends ContentProvider {
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
}
+ // 返回插入的uri路径
return ContentUris.withAppendedId(uri, insertedId);
}
@Override
+ // 删除一个uri
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)) {
@@ -228,6 +259,7 @@ public class NotesProvider extends ContentProvider {
}
@Override
+ // 更新一个uri
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
String id = null;
@@ -267,10 +299,12 @@ 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 ");
@@ -293,6 +327,7 @@ public class NotesProvider extends ContentProvider {
sql.append(selectString);
}
+ // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
mHelper.getWritableDatabase().execSQL(sql.toString());
}
diff --git a/MiNote/app/src/main/res/values-zh-rCN/strings.xml b/MiNote/app/src/main/res/values-zh-rCN/strings.xml
index fcb02e5..4a952d7 100644
--- a/MiNote/app/src/main/res/values-zh-rCN/strings.xml
+++ b/MiNote/app/src/main/res/values-zh-rCN/strings.xml
@@ -38,6 +38,9 @@
私密模式
退出私密模式
+ 背景: 花
+ 背景: 山
+ 背景: 水
新建文件夹
导出文本
同步