Compare commits

..

No commits in common. 'tyx_branch' and 'main' have entirely different histories.

@ -0,0 +1,79 @@
#include<stdio.h>
#include<stdlib.h>
void chiocesort(int arr[]) {
for (int i = 0; i < 29; i++) {
int index = i;
for (int j = i; j < 30; j++) {
if (arr[j] < arr[index]){
index = j;
}
}
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
for (int k = 0; k < 30; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
}
void adjustHeap(int arr[], int n, int root) {
int parent = root;
int child = root * 2 + 1;
while (child < n) {
if ((child + 1) < n && arr[child] < arr[child + 1]) {
child++;
}
if (arr[parent] < arr[child]) {
int temp = arr[parent];
arr[parent] = arr[child];
arr[child] = temp;
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
// 堆排序(升序)
void heapSort(int arr[], int n) {
//建堆
printf("建堆过程\n");
for (int i = n / 2 - 1; i >= 0; i--) {
adjustHeap(arr, n, i);
for (int k = 0; k < 30; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
printf("调整过程\n");
for (int i = n - 1; i >= 0; i--) {
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
adjustHeap(arr, i, 0);
for (int k = 0; k < 30; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
}
int main() {
int arr[30];
int arr1[30];
printf("原始数组\n");
for (int i = 0; i < 30; i++) {
arr1[i] = rand() % 100;
arr[i] = arr1[i];
printf("%d ",arr[i]);
}
printf("\n");
printf("选择排序\n");
chiocesort(arr);
printf("\n");
printf("heap\n");
heapSort(arr1, 30);
return 0;
}

@ -1,99 +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.Context;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.text.TextUtils;
import android.util.Log;
/**
*
*
*
*/
public class Contact {
private static final String TAG = "Contact";
/**
*
*
*
* 1. ID
* 2. ID
*
* @param context 访ContentResolver
* @param phoneNumber
* @return null
*/
public static String getContact(Context context, String phoneNumber) {
// 检查电话号码是否为空或null
if (TextUtils.isEmpty(phoneNumber)) {
return null;
}
Cursor cursor = null;
try {
// 第一步通过电话号码查询联系人ID
// 查询Phone.CONTENT_URI获取与该电话号码关联的联系人ID
cursor = context.getContentResolver().query(
Phone.CONTENT_URI, // 联系人电话URI
new String[]{Phone.CONTACT_ID}, // 只需要联系人ID字段
Phone.NUMBER + "=?", // 查询条件:电话号码匹配
new String[]{phoneNumber}, // 查询参数
null); // 排序方式
// 如果查询成功且有结果
if (cursor != null && cursor.moveToFirst()) {
// 获取联系人ID
long contactId = cursor.getLong(0);
cursor.close();
// 第二步通过联系人ID查询联系人显示名称
// 查询Data.CONTENT_URI获取联系人的结构化名称
cursor = context.getContentResolver().query(
Data.CONTENT_URI, // 联系人数据URI
new String[]{StructuredName.DISPLAY_NAME}, // 只需要显示名称字段
Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", // 查询条件
new String[]{
String.valueOf(contactId), // 联系人ID
StructuredName.CONTENT_ITEM_TYPE // MIME类型结构化名称
},
null);
// 如果查询成功且有结果,返回联系人姓名
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(0);
}
}
} catch (Exception e) {
// 记录异常日志
Log.e(TAG, "Get contact by phone number failed: " + e.getMessage());
} finally {
// 确保游标被关闭,防止内存泄漏
if (cursor != null) {
cursor.close();
}
}
// 未找到联系人或发生异常时返回null
return null;
}
}

@ -1,297 +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.net.Uri;
/**
*
*
*
* 1. ContentProvider
* 2.
* 3. ID
* 4. Intent
* 5. Widget
* 6.
* 7. TextNoteCallNote
*
* 访
*/
public class Notes {
// ContentProvider授权名称用于构建Content URI
public static final String AUTHORITY = "micode_notes";
// 日志标签
public static final String TAG = "Notes";
/**
*
* TYPE_NOTE(0):
* TYPE_FOLDER(1):
* TYPE_SYSTEM(2):
*/
public static final int TYPE_NOTE = 0;
public static final int TYPE_FOLDER = 1;
public static final int TYPE_SYSTEM = 2;
/**
* ID
* ID
* ID_ROOT_FOLDER(0):
* ID_TEMPARAY_FOLDER(-1):
* ID_CALL_RECORD_FOLDER(-2):
* ID_TRASH_FOLER(-3):
*/
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;
public static final int ID_TRASH_FOLER = -3;
/**
* Intent Extra
* Activity
*/
// 提醒日期,用于闹钟功能
public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date";
// 背景颜色ID用于设置笔记背景色
public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id";
// Widget ID用于桌面Widget
public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id";
// Widget类型2x或4x
public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type";
// 文件夹ID用于指定笔记所属文件夹
public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id";
// 通话日期,用于通话记录笔记
public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date";
/**
* Widget
* TYPE_WIDGET_INVALIDE(-1): Widget
* TYPE_WIDGET_2X(0): 2x2Widget
* TYPE_WIDGET_4X(1): 4x4Widget
*/
public static final int TYPE_WIDGET_INVALIDE = -1;
public static final int TYPE_WIDGET_2X = 0;
public static final int TYPE_WIDGET_4X = 1;
/**
*
* MIME
* MIMEContentProviderMIME
*/
public static class DataConstants {
// 普通文本笔记的MIME类型
public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
// 通话记录笔记的MIME类型
public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
}
// 笔记表的Content URI
// 格式content://micode_notes/note
// 用于访问note表的所有记录
public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note");
// 数据表的Content URI
// 格式content://micode_notes/data
// 用于访问data表的所有记录
public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
/**
*
*
* note
* - IDID
* -
* -
* - Widget
* -
*
* note
*/
public interface NoteColumns {
// 主键ID自增
public static final String ID = "_id";
// 父文件夹ID0表示根文件夹负数表示系统文件夹
public static final String PARENT_ID = "parent_id";
// 创建时间Unix时间戳毫秒
public static final String CREATED_DATE = "created_date";
// 最后修改时间Unix时间戳毫秒
public static final String MODIFIED_DATE = "modified_date";
// 提醒时间Unix时间戳毫秒0表示无提醒
public static final String ALERTED_DATE = "alert_date";
// 内容摘要,显示在列表中的预览文本
public static final String SNIPPET = "snippet";
// 桌面Widget ID-1表示未添加到桌面
public static final String WIDGET_ID = "widget_id";
// 桌面Widget类型0=2x21=4x4
public static final String WIDGET_TYPE = "widget_type";
// 背景颜色ID用于设置笔记背景色
public static final String BG_COLOR_ID = "bg_color_id";
// 是否有附件0=无1=有
public static final String HAS_ATTACHMENT = "has_attachment";
// 包含的笔记数量(仅文件夹有效)
public static final String NOTES_COUNT = "notes_count";
// 类型0=笔记1=文件夹2=系统文件夹
public static final String TYPE = "type";
// Google Task同步ID用于云端同步
public static final String SYNC_ID = "sync_id";
// 本地修改标记0=未修改1=已修改
public static final String LOCAL_MODIFIED = "local_modified";
// 原始父文件夹ID用于同步时恢复文件夹结构
public static final String ORIGIN_PARENT_ID = "origin_parent_id";
// Google Task ID用于与Google Tasks同步
public static final String GTASK_ID = "gtask_id";
// 版本号,用于冲突检测和同步
public static final String VERSION = "version";
}
/**
*
*
* dataEAVEntity-Attribute-Value
* - data
* - MIME_TYPE
* - NOTE_IDnote
* - DATA1-DATA5
*
* data
*/
public interface DataColumns {
// 主键ID自增
public static final String ID = "_id";
// MIME类型区分数据类型text_note、call_note等
public static final String MIME_TYPE = "mime_type";
// 所属笔记ID外键关联note表
public static final String NOTE_ID = "note_id";
// 创建时间Unix时间戳毫秒
public static final String CREATED_DATE = "created_date";
// 最后修改时间Unix时间戳毫秒
public static final String MODIFIED_DATE = "modified_date";
// 内容文本,存储笔记的实际内容
public static final String CONTENT = "content";
// 扩展数据字段1INTEGER类型
// TextNote: MODE模式如清单模式
// CallNote: CALL_DATE通话日期
public static final String DATA1 = "data1";
// 扩展数据字段2INTEGER类型
// 预留字段
public static final String DATA2 = "data2";
// 扩展数据字段3TEXT类型
// CallNote: PHONE_NUMBER电话号码
public static final String DATA3 = "data3";
// 扩展数据字段4TEXT类型
// 预留字段
public static final String DATA4 = "data4";
// 扩展数据字段5TEXT类型
// 预留字段
public static final String DATA5 = "data5";
}
/**
*
*
* DataColumns
* - MODE
* - MIMEContentProvider
* - CONTENT_URI访URI
*
*
* -
* -
*/
public static final class TextNote implements DataColumns {
// 模式字段映射到DATA1
public static final String MODE = DATA1;
// 清单模式标识
// MODE_CHECK_LIST=1: 清单模式(复选框列表)
// MODE=0或其他: 普通文本模式
public static final int MODE_CHECK_LIST = 1;
// MIME类型文本笔记目录多条记录
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note";
// MIME类型文本笔记项单条记录
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
// 访问文本笔记的Content URI
// 格式content://micode_notes/text_note
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
}
/**
*
*
* DataColumns
* - CALL_DATE
* - PHONE_NUMBER
* - MIMEContentProvider
* - CONTENT_URI访URI
*
*
* - /
* -
* -
*/
public static final class CallNote implements DataColumns {
// 通话日期字段映射到DATA1
// 存储格式Unix时间戳毫秒
public static final String CALL_DATE = DATA1;
// 电话号码字段映射到DATA3
// 存储格式:字符串(如"13800138000"
public static final String PHONE_NUMBER = DATA3;
// MIME类型通话笔记目录多条记录
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";
// 访问通话笔记的Content URI
// 格式content://micode_notes/call_note
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
}
}

@ -1,748 +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;
/**
*
*
*
* 1. SQLiteOpenHelperSQLite
* 2. notedataSQL
* 3.
* 4.
*
*
* - noteID
* - data
* -
*
*
* - 使getInstance()
* -
*/
public class NotesDatabaseHelper extends SQLiteOpenHelper {
// 数据库文件名
private static final String DB_NAME = "note.db";
// 数据库版本号当前为版本5
// 版本历史:
// V1: 初始版本
// V2: 重建表结构
// V3: 添加Google Task支持和回收站
// V4: 添加版本号字段
// V5: 当前版本
private static final int DB_VERSION = 5;
/**
*
*
*/
public interface TABLE {
// 笔记表,存储笔记基本信息
public static final String NOTE = "note";
// 数据表,存储笔记具体内容
public static final String DATA = "data";
}
private static final String TAG = "NotesDatabaseHelper";
// 单例实例,确保全局只有一个数据库连接
private static NotesDatabaseHelper mInstance;
/**
* SQL
*
* note
* - ID:
* - PARENT_ID: ID0==
* - ALERTED_DATE: 0=
* - BG_COLOR_ID: ID
* - CREATED_DATE:
* - HAS_ATTACHMENT: 0=1=
* - MODIFIED_DATE:
* - NOTES_COUNT:
* - SNIPPET:
* - TYPE: 0=1=2=
* - WIDGET_ID: Widget ID
* - WIDGET_TYPE: Widget-1=0=2x21=4x4
* - SYNC_ID: GoogleID
* - LOCAL_MODIFIED:
* - ORIGIN_PARENT_ID: ID
* - GTASK_ID: Google Task ID
* - VERSION:
*/
private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," +
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
")";
/**
* SQL
*
* data
* - ID:
* - MIME_TYPE: MIMEtext_notecall_note
* - NOTE_ID: IDnote
* - CREATED_DATE:
* - MODIFIED_DATE:
* - CONTENT:
* - DATA1-DATA5:
*
* EAV
* - data
* - MIME_TYPE
* - NOTE_IDnote
*/
private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," +
DataColumns.MIME_TYPE + " TEXT NOT NULL," +
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 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
*
*
* - dataNOTE_ID
* - ID
* - note-data
*/
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
/**
*
*
* notePARENT_ID
* PARENT_ID
* NOTES_COUNT1
*
* 使
* -
* -
*/
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";
/**
*
*
* notePARENT_ID
* PARENT_ID
* NOTES_COUNT10
*
*
* - 使old.PARENT_IDID
* - NOTES_COUNT>0
*/
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";
/**
*
*
* note
*
* NOTES_COUNT1
*
* 使
* -
* -
*/
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";
/**
*
*
* note
*
* NOTES_COUNT10
*
*
* - 使old.PARENT_IDID
* - NOTES_COUNT>0
*/
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";
/**
*
*
* data
* MIME_TYPEDataConstants.NOTE
* noteSNIPPET
*
* 使
* -
* -
*
*
* -
* -
*/
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";
/**
*
*
* data
* MIME_TYPEDataConstants.NOTE
* noteSNIPPET
*
* 使
* -
* -
*
*
* - MIME_TYPE
* -
*/
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";
/**
*
*
* data
* MIME_TYPEDataConstants.NOTE
* noteSNIPPET
*
* 使
* -
* -
*
*
* - NULL
* -
*/
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";
/**
*
*
* note
*
* dataNOTE_IDID
*
* 使
* -
* -
*
*
* -
* -
*/
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";
/**
*
*
* note
*
* notePARENT_IDID
*
* 使
* -
* -
*
*
* -
* -
* -
*/
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";
/**
*
*
* note
* PARENT_IDIDNotes.ID_TRASH_FOLER
* PARENT_IDID
*
* 使
* -
* -
*
*
* -
* -
* -
*/
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";
/**
*
*
* SQLiteOpenHelper
* - context:
* - DB_NAME: note.db
* - factory: Cursornull使
* - DB_VERSION: 5
*
* @param context 访
*/
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
*
*
*
* 1. CREATE_NOTE_TABLE_SQLnote
* 2. note
* 3.
*
* onCreate
*
* @param db SQLiteDatabaseSQL
*/
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL);
reCreateNoteTableTriggers(db);
createSystemFolder(db);
Log.d(TAG, "note table has been created");
}
/**
*
*
*
* 1. note
* 2. note
*
*
* - increase_folder_count_on_update:
* - decrease_folder_count_on_update:
* - decrease_folder_count_on_delete:
* - delete_data_on_delete:
* - increase_folder_count_on_insert:
* - folder_delete_notes_on_delete:
* - folder_move_notes_on_trash:
*
* 使
* -
* -
*
* @param db SQLiteDatabaseSQL
*/
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);
}
/**
*
*
*
* 1. ID_CALL_RECORD_FOLDER-2:
* 2. ID_ROOT_FOLDER0:
* 3. ID_TEMPARAY_FOLDER-1:
* 4. ID_TRASH_FOLER-3:
*
* TYPETYPE_SYSTEM2
*
* 使
* -
* -
*
* @param db SQLiteDatabaseSQL
*/
private void createSystemFolder(SQLiteDatabase db) {
ContentValues values = new ContentValues();
// 创建通话记录文件夹
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建根文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建临时文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
// 创建回收站文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
}
/**
*
*
*
* 1. CREATE_DATA_TABLE_SQLdata
* 2. data
* 3. datanote_id_index
*
* onCreate
*
* @param db SQLiteDatabaseSQL
*/
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");
}
/**
*
*
*
* 1. data
* 2. data
*
*
* - update_note_content_on_insert:
* - update_note_content_on_update:
* - update_note_content_on_delete:
*
* 使
* -
* -
*
* @param db SQLiteDatabaseSQL
*/
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);
}
/**
*
*
* 使线
* 1. mInstancenull
* 2. null
* 3.
*
*
* -
* -
* - 线
*
* 使
* -
* - NotesProvider
*
* @param context
* @return NotesDatabaseHelper
*/
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
}
/**
*
*
*
* 1. note
* 2. data
*
* SQLiteOpenHelper
* -
* -
*
* @param db SQLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase db) {
createNoteTable(db);
createDataTable(db);
}
/**
*
*
*
* -
* -
* -
*
*
* V1 -> V2: upgradeToV2
* V2 -> V3: Google TaskupgradeToV3
* V3 -> V4: upgradeToV4
*
*
* -
* - IllegalStateException
* -
*
* @param db SQLiteDatabase
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false;
boolean skipV2 = false;
// 从版本1升级到版本2
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // V2升级已在V1升级中完成跳过V2
oldVersion++;
}
// 从版本2升级到版本3
if (oldVersion == 2 && !skipV2) {
upgradeToV3(db);
reCreateTriggers = true; // V3升级需要重建触发器
oldVersion++;
}
// 从版本3升级到版本4
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");
}
}
/**
* 2 -
*
*
* 1. notedata
* 2. notedata
* 3.
* 4.
*
*
* -
* - 1使
* -
*
* @param db SQLiteDatabase
*/
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);
}
/**
* 3 - Google Task
*
*
* 1.
* 2. noteGTASK_ID
* 3. ID_TRASH_FOLER
*
*
* - Google TaskGTASK_IDGoogle Tasks
* -
*
*
* - reCreateTriggers=true
* - GTASK_ID
*
* @param db SQLiteDatabase
*/
private void upgradeToV3(SQLiteDatabase db) {
// 删除旧的触发器(已废弃)
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");
// 添加Google Task ID字段
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
+ " TEXT NOT NULL DEFAULT ''");
// 创建回收站文件夹
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);
}
/**
* 4 -
*
*
* 1. noteVERSION
*
*
* - VERSION
* -
* -
*
*
* - VERSION0
* - VERSION1increaseNoteVersion
*
* @param db SQLiteDatabase
*/
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
}

@ -1,74 +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;
/**
* ContentProvider
*
*
* 1. 访
* 2. CRUDCreateReadUpdateDelete
* 3.
* 4.
* 5.
*
* Content URI
* - content://micode_notes/note : 访问所有笔记
* - content://micode_notes/note/# : 访问指定ID的笔记
* - content://micode_notes/data : 访问所有数据
* - content://micode_notes/data/# : 访问指定ID的数据
* - content://micode_notes/search : 搜索笔记
* - content://micode_notes/search_suggest/query : 搜索建议
*
*
* - 使UriMatcherURI
* - 使NotesDatabaseHelper
* - 使ContentResolver
*/
public class NotesProvider extends ContentProvider {
// URI匹配器用于匹配不同的Content URI
private static final UriMatcher mMatcher;
// 数据库帮助类实例
private NotesDatabaseHelper mHelper;
private static final String TAG = "NotesProvider";
/**
* URI
* UriMatcherURI
*/
// 访问所有笔记content://micode_notes/note
private static final int URI_NOTE = 1;
// 访问指定笔记content://micode_notes/note/#
private static final int URI_NOTE_ITEM =

@ -0,0 +1,2 @@
# rjgc
Loading…
Cancel
Save