亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android組件之ContentProvider(二)

2019-11-11 06:01:13
字體:
來源:轉載
供稿:網友

一個共享生詞本的應用以熟悉ContentPRovider和sqlite基本用法:

應用dictprovider

Word數據封裝類:

public final class Words{ // 定義該ContentProvider的Authorities public static final String AUTHORITY = "com.example.mrpeng.dictprovider"; // 定義一個靜態內部類,定義該ContentProvider所包含的數據列的列名 public static final class Word implements BaseColumns { // 定義Content所允許操作的三個數據列 public final static String _ID = "_id"; public final static String WORD = "word"; public final static String DETAIL = "detail"; // 定義該Content提供服務的兩個Uri public final static Uri DICT_CONTENT_URI = Uri .parse("content://" + AUTHORITY + "/words"); public final static Uri WORD_CONTENT_URI = Uri .parse("content://" + AUTHORITY + "/word"); }}

自定義的provider

public class DictProvider extends ContentProvider { private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int WORDS = 1; private static final int WORD = 2; private MyDataBaseHelper dbOpenHelper; static { // 為UriMatcher注冊兩個Uri matcher.addURI(Words.AUTHORITY, "words", WORDS); matcher.addURI(Words.AUTHORITY, "word/#", WORD); } // 第一次調用該DictProvider時,系統先創建DictProvider對象,并回調該方法 @Override public boolean onCreate() { dbOpenHelper = new MyDataBaseHelper(this.getContext(), "myDict.db3", 1); return true; } // 返回指定Uri參數對應的數據的MIME類型 @Override public String getType(Uri uri) { switch (matcher.match(uri)) { // 如果操作的數據是多項記錄 case WORDS: return "vnd.android.cursor.dir/org.crazyit.dict"; // 如果操作的數據是單項記錄 case WORD: return "vnd.android.cursor.item/org.crazyit.dict"; default: throw new IllegalArgumentException("未知Uri:" + uri); } } // 查詢數據的方法 @Override public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder) { SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); switch (matcher.match(uri)) { // 如果Uri參數代表操作全部數據項 case WORDS: // 執行查詢 return db.query("dict", projection, where, whereArgs, null, null, sortOrder); // 如果Uri參數代表操作指定數據項 case WORD: // 解析出想查詢的記錄ID long id = ContentUris.parseId(uri); String whereClause = Words.Word._ID + "=" + id; // 如果原來的where子句存在,拼接where子句 if (where != null && !"".equals(where)) { whereClause = whereClause + " and " + where; Log.e("mrpeng", "whereClause+=where::: " + whereClause); } return db.query("dict", projection, whereClause, whereArgs, null, null, sortOrder); default: throw new IllegalArgumentException("未知Uri:" + uri); } } // 插入數據方法 @Override public Uri insert(Uri uri, ContentValues values) { // 獲得數據庫實例 SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); switch (matcher.match(uri)) { // 如果Uri參數代表操作全部數據項 case WORDS: // 插入數據,返回插入記錄的ID long rowId = db.insert("dict", Words.Word._ID, values); // 如果插入成功返回uri if (rowId > 0) { // 在已有的 Uri的后面追加ID Uri wordUri = ContentUris.withAppendedId(uri, rowId); // 通知數據已經改變 getContext().getContentResolver() .notifyChange(wordUri, null); return wordUri; } break; default: throw new IllegalArgumentException("未知Uri:" + uri); } return null; } // 修改數據的方法 @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); // 記錄所修改的記錄數 int num = 0; switch (matcher.match(uri)) { // 如果Uri參數代表操作全部數據項 case WORDS: num = db.update("dict", values, where, whereArgs); break; // 如果Uri參數代表操作指定數據項 case WORD: // 解析出想修改的記錄ID long id = ContentUris.parseId(uri); String whereClause = Words.Word._ID + "=" + id; // 如果原來的where子句存在,拼接where子句 if (where != null && !where.equals("")) { whereClause = whereClause + " and " + where; } num = db.update("dict", values, whereClause, whereArgs); break; default: throw new IllegalArgumentException("未知Uri:" + uri); } // 通知數據已經改變 getContext().getContentResolver().notifyChange(uri, null); return num; } // 刪除數據的方法 @Override public int delete(Uri uri, String where, String[] whereArgs) { SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); // 記錄所刪除的記錄數 int num = 0; // 對uri進行匹配 switch (matcher.match(uri)) { // 如果Uri參數代表操作全部數據項 case WORDS: num = db.delete("dict", where, whereArgs); break; // 如果Uri參數代表操作指定數據項 case WORD: // 解析出所需要刪除的記錄ID long id = ContentUris.parseId(uri); String whereClause = Words.Word._ID + "=" + id; // 如果原來的where子句存在,拼接where子句 if (where != null && !where.equals("")) { whereClause = whereClause + " and " + where; } num = db.delete("dict", whereClause, whereArgs); break; default: throw new IllegalArgumentException("未知Uri:" + uri); } // 通知數據已經改變 getContext().getContentResolver().notifyChange(uri, null); return num; }}

自定義SqliteOpentHelper

public class MyDataBaseHelper extends SQLiteOpenHelper { final String CREATE_TABLE_SQL = "create table dict(_id integer primary " + "key autoincrement , word , detail)"; public MyDataBaseHelper(Context context, String name, int version) { super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.e("mrpeng", "onUpgrade: " + oldVersion + "---->" + newVersion); }}

主界面

public class MainActivity extends AppCompatActivity { private MyDataBaseHelper dbHelper; private Button insert; private Button search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); File dir = Environment.getExternalStorageDirectory();//Gets the Android data directory String path = dir.getPath(); Log.e("mrpeng", "path: "+path ); dbHelper = new MyDataBaseHelper(this, "myDict.db3", 1); insert = (Button) findViewById(R.id.insert); search = (Button) findViewById(R.id.search); insert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String word = ((EditText) findViewById(R.id.word)).getText().toString(); String detail = ((EditText) findViewById(R.id.detail)).getText().toString(); SQLiteDatabase readableDatabase = dbHelper.getReadableDatabase(); // 執行插入語句 readableDatabase.execSQL("insert into dict values(null , ? , ?)" , new String[] {word, detail }); } }); search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 獲取用戶輸入 String key = ((EditText) findViewById(R.id.key)).getText() .toString(); // 執行查詢 Cursor cursor = dbHelper.getReadableDatabase().rawQuery( "select * from dict where word like ? or detail like ?", new String[] { "%" + key + "%", "%" + key + "%" }); ArrayList<Map<String, String>> list = converCursorToList(cursor); Bundle bundle = new Bundle(); bundle.putSerializable("data",list); Intent intent = new Intent(MainActivity.this, ResultActivity.class); intent.putExtras(bundle); startActivity(intent); } }); } private ArrayList<Map<String,String>> converCursorToList(Cursor cursor) { ArrayList<Map<String, String>> list= new ArrayList<>(); while (cursor.moveToNext()){ HashMap<String, String> map = new HashMap<>(); map.put("word",cursor.getString(1)); map.put("detail",cursor.getString(2)); list.add(map); } return list; }}

結果展示頁

public class ResultActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.popup); ListView listView = (ListView) findViewById(R.id.show); Intent intent = getIntent(); Bundle data = intent.getExtras(); List<Map<String,String>> list = (List<Map<String, String>>) data.getSerializable("data"); // 將List封裝成SimpleAdapter SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this , list, R.layout.line, new String[] { "word", "detail" } , new int[] {R.id.word, R.id.detail }); listView.setAdapter(adapter); }}

manifests

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mrpeng.dictprovider"> <application android:allowBackup="true" android:icon="@mdictResolver應用

數據封裝類 Word 結果展示類ResultActivity同應用dictprovider

主界面

public class MainActivity extends AppCompatActivity { private ContentResolver contentResolver; private Button insert; private Button search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); insert = (Button) findViewById(R.id.insert); search = (Button) findViewById(R.id.search); insert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 獲取用戶輸入 String word = ((EditText) findViewById(R.id.word)) .getText().toString(); String detail = ((EditText) findViewById(R.id.detail)) .getText().toString(); //插入生詞記錄 ContentValues values = new ContentValues(); values.put(Words.Word.WORD,word); values.put(Words.Word.DETAIL,detail); contentResolver.insert(Words.Word.DICT_CONTENT_URI,values); Toast.makeText(MainActivity.this,"添加生詞成功",Toast.LENGTH_SHORT).show(); } }); // 為search按鈕的單擊事件綁定事件監聽器 search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View source) { // 獲取用戶輸入 String key = ((EditText) findViewById(R.id.key)) .getText().toString(); // 執行查詢 Cursor cursor = contentResolver.query( Words.Word.DICT_CONTENT_URI, null, "word like ? or detail like ?", new String[] { "%" + key + "%", "%" + key + "%" }, null); // 創建一個Bundle對象 Bundle data = new Bundle(); data.putSerializable("data", converCursorToList(cursor)); // 創建一個Intent Intent intent = new Intent(MainActivity.this, ResultActivity.class); intent.putExtras(data); // 啟動Activity startActivity(intent); } }); } private ArrayList<Map<String, String>> converCursorToList(Cursor cursor) { ArrayList<Map<String, String>> result = new ArrayList<>(); // 遍歷Cursor結果集 while (cursor.moveToNext()) { // 將結果集中的數據存入ArrayList中 Map<String, String> map = new HashMap<>(); // 取出查詢記錄中第2列、第3列的值 map.put(Words.Word.WORD, cursor.getString(1)); map.put(Words.Word.DETAIL, cursor.getString(2)); result.add(map); } return result; }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线观看| 欧美久久精品一级黑人c片| 国产福利成人在线| 精品视频一区在线视频| 欧美精品电影在线| 亚洲999一在线观看www| 最近2019年好看中文字幕视频| 亚洲韩国日本中文字幕| 国产一区二区在线免费| 国内精品伊人久久| 欧洲永久精品大片ww免费漫画| 亚洲欧美另类人妖| 亚洲国产成人精品女人久久久| 欧美亚洲在线视频| 亚洲精品国精品久久99热一| 少妇高潮久久久久久潘金莲| 久久久久久久久久久成人| 日韩大陆欧美高清视频区| 日韩精品在线观| 国产免费一区视频观看免费| 国产91精品最新在线播放| 欧美日韩久久久久| 国产精品日韩久久久久| 亚洲人成在线免费观看| 国产精品久久久久久久久久久不卡| 欧美黄色片视频| 欧美夜福利tv在线| 精品日韩中文字幕| 国产午夜一区二区| 久久91精品国产91久久跳| 91欧美激情另类亚洲| 国产欧美va欧美va香蕉在线| 日本a级片电影一区二区| 亚洲欧洲xxxx| 日韩美女写真福利在线观看| 久久综合九色九九| 久久琪琪电影院| 欧美精品videofree1080p| 91色视频在线导航| 97精品在线视频| 日本一欧美一欧美一亚洲视频| 国产综合视频在线观看| 亚洲欧美国产精品| 亚洲精品久久久久久久久久久久久| 热99精品里视频精品| 久久影视免费观看| 国产精品吹潮在线观看| 欧美电影第一页| 欧美国产极速在线| 成人黄色短视频在线观看| www.亚洲一区| 国产精品精品久久久久久| 国产亚洲精品日韩| 午夜精品一区二区三区在线| 亚洲欧美日韩一区二区在线| 亚洲精品理论电影| 欧美日韩国产999| 蜜月aⅴ免费一区二区三区| 国产成人免费91av在线| 欧美激情国产高清| 亚洲va久久久噜噜噜| 宅男66日本亚洲欧美视频| 欧美一级片久久久久久久| 亚洲第一网中文字幕| 国产精品狼人色视频一区| 亚洲丝袜在线视频| 国产精品女视频| 亚洲国产又黄又爽女人高潮的| 久久久久久国产精品久久| 久久99视频精品| 午夜精品久久久久久久男人的天堂| 国内精品久久久久久| 欧美视频在线观看免费| 国产亚洲日本欧美韩国| 正在播放欧美一区| 日韩免费在线视频| 欧美肥臀大乳一区二区免费视频| 欧美老女人www| 另类美女黄大片| 欧美亚洲另类激情另类| 成人h片在线播放免费网站| 亚洲国产精品专区久久| 欧美中文字幕第一页| 亚洲精品小视频在线观看| 国产精品丝袜久久久久久高清| 国产精品久久久精品| 欧美激情中文字幕乱码免费| 91久久在线视频| 国产精品永久在线| 亚洲免费视频在线观看| 国产精品久久久久久久久久99| 国产激情视频一区| 欧美最顶级的aⅴ艳星| 久久国产精品影视| 成人福利网站在线观看| 精品国产户外野外| 欧美日韩国产区| 国产精品精品国产| 亚洲美女在线看| 欧美福利视频网站| 日韩av第一页| 插插插亚洲综合网| 欧美精品久久一区二区| 亚洲最大福利网| 午夜精品国产精品大乳美女| 欧美在线xxx| 欧洲亚洲妇女av| 精品福利视频导航| 国产精品流白浆视频| 国产精品视频成人| 91免费看视频.| 欧美激情亚洲视频| 精品视频在线播放| 青青草原一区二区| 国产91精品久久久久久久| 国产伊人精品在线| 久久久久久久国产| 欧美激情网站在线观看| 国产成人精品一区二区| 国产亚洲精品成人av久久ww| 亚洲小视频在线观看| 51精品国产黑色丝袜高跟鞋| 久久久久成人精品| 欧美大片在线看| 亚洲国产精品久久| 中文字幕亚洲综合| 国产一区二区三区视频免费| 欧美猛男性生活免费| 久久精品影视伊人网| 久久夜精品va视频免费观看| 91精品国产乱码久久久久久久久| 国产精国产精品| 中文字幕少妇一区二区三区| 欧美猛男性生活免费| 日韩av中文字幕在线播放| 中文字幕亚洲一区| 欧美亚洲成人精品| 姬川优奈aav一区二区| xvideos亚洲人网站| 中文字幕亚洲色图| 少妇高潮 亚洲精品| 久久国产精品久久久久久| 亚洲欧美中文字幕在线一区| 久久av资源网站| 美女视频久久黄| 中文字幕av一区| 欧美电影在线播放| 亚洲剧情一区二区| 国产精品小说在线| 91夜夜揉人人捏人人添红杏| 欧美天天综合色影久久精品| 亚洲国产精品成人va在线观看| 欧美日韩激情视频| 久久久成人精品| 精品香蕉在线观看视频一| 伊人精品在线观看| 久久好看免费视频| 久久久999国产精品| 欧美激情精品久久久久久久变态| 欧美另类极品videosbest最新版本| 欧美自拍视频在线| 国产日韩欧美成人| 欧美午夜丰满在线18影院| 亚洲精品456在线播放狼人|