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

首頁 > 系統 > Android > 正文

Android組件之ContentProvider(二)

2019-11-11 06:54:00
字體:
來源:轉載
供稿:網友

一個共享生詞本的應用以熟悉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
欧美视频在线观看 亚洲欧| 欧美日韩人人澡狠狠躁视频| 91夜夜揉人人捏人人添红杏| 久久精品国产69国产精品亚洲| 国产精品国产福利国产秒拍| 亚洲福利视频免费观看| 精品久久久久久久久国产字幕| 国产精品一区二区三区在线播放| 4k岛国日韩精品**专区| 国产精品一区二区av影院萌芽| 成人黄色生活片| 国产精品久久久久久婷婷天堂| 国产成人精品视频在线| 国产精品久久久久久搜索| 国产成人黄色av| 91精品国产色综合久久不卡98| 色狠狠av一区二区三区香蕉蜜桃| 国产69精品久久久久9| 国产噜噜噜噜噜久久久久久久久| 久久夜色撩人精品| 黑人欧美xxxx| 中文字幕一精品亚洲无线一区| 日韩精品中文在线观看| 国产精品日日做人人爱| 欧美猛交免费看| 国产91精品网站| 亚洲美女动态图120秒| 国产亚洲精品综合一区91| 4k岛国日韩精品**专区| 91精品啪aⅴ在线观看国产| 欧美亚洲国产视频小说| 亚洲第一色中文字幕| 久久91精品国产91久久跳| 久久香蕉精品香蕉| 欧美理论电影在线播放| 欧美—级a级欧美特级ar全黄| 国产91热爆ts人妖在线| 国产精品一区二区久久久久| 日韩欧美国产中文字幕| 91产国在线观看动作片喷水| 精品国产乱码久久久久久婷婷| 国产69精品久久久| 久久久国产精彩视频美女艺术照福利| 欧美激情按摩在线| 精品中文字幕视频| 欧美超级乱淫片喷水| 亚洲成人av片| 欧美性猛交xxxx乱大交3| 91爱视频在线| 成人激情黄色网| 国产精品久久久久久亚洲调教| 国产精品人人做人人爽| 日韩国产中文字幕| 久久亚洲私人国产精品va| 亚洲人成电影网站色www| 97国产一区二区精品久久呦| 中文字幕成人精品久久不卡| 国产成人小视频在线观看| 久久精品中文字幕电影| 欧美精品免费在线| 国产精品免费视频久久久| 亚洲欧美中文日韩在线v日本| 日韩在线视频导航| 2023亚洲男人天堂| 亚洲人成在线电影| 国产成人拍精品视频午夜网站| 在线看日韩欧美| 亚洲人成欧美中文字幕| 国产精品女人网站| 欧美日韩激情视频8区| 日韩精品有码在线观看| 日韩欧美高清视频| 欧美色道久久88综合亚洲精品| 国内精品模特av私拍在线观看| 日韩av片永久免费网站| 日韩美女在线观看| 亚洲欧美在线免费观看| 国产精品永久在线| 久久久久久综合网天天| 精品视频www| 日韩精品在线观看网站| 日韩中文字幕视频在线观看| 精品国产一区二区三区久久狼黑人| 韩国三级日本三级少妇99| 97在线观看免费高清| 日本一欧美一欧美一亚洲视频| 国产日韩精品综合网站| 久久久久久九九九| 国产精品av免费在线观看| www.日韩av.com| 色老头一区二区三区| 日韩在线一区二区三区免费视频| 欧美性生交xxxxx久久久| 国外日韩电影在线观看| 亚洲无亚洲人成网站77777| 久久综合电影一区| 国产在线精品播放| 日韩精品免费在线视频观看| 久久久亚洲影院| 亚洲丁香久久久| 久99九色视频在线观看| 日韩三级成人av网| 国产精品永久免费| 国产视频精品免费播放| 中文字幕亚洲欧美在线| 亚洲精品第一国产综合精品| 久久天天躁狠狠躁夜夜爽蜜月| 欧美肥婆姓交大片| 77777亚洲午夜久久多人| 亚洲第一偷拍网| 亚洲国产中文字幕在线观看| 欧美精品免费在线观看| 日韩欧美精品中文字幕| 最近2019好看的中文字幕免费| 欧美日韩精品在线播放| 伊人亚洲福利一区二区三区| 久久国产视频网站| 欧美精品久久久久a| 中文字幕欧美日韩在线| 国产91精品视频在线观看| 亚洲另类激情图| 91精品视频免费看| 久久久久久国产精品三级玉女聊斋| 亚洲国产又黄又爽女人高潮的| 一区二区中文字幕| 国产日韩在线免费| 亚洲欧美色图片| 国产精品欧美日韩久久| 91视频免费网站| 精品性高朝久久久久久久| 国产精品久久久久久av下载红粉| 国产精品吹潮在线观看| 揄拍成人国产精品视频| 欧美性生交大片免网| 国产成人免费91av在线| 4k岛国日韩精品**专区| 久久99视频精品| 亚洲午夜精品视频| yw.139尤物在线精品视频| 91九色国产社区在线观看| 欧洲亚洲女同hd| 欧美日韩成人精品| 亚洲欧美在线一区| 日本久久久久久久| 亚洲高清av在线| 日韩欧美在线看| 成人日韩在线电影| 高清欧美一区二区三区| 日韩欧美aaa| 亚洲黄色免费三级| 久久综合久中文字幕青草| 久久久久久伊人| 国产精品海角社区在线观看| 成人国产亚洲精品a区天堂华泰| 色综合久综合久久综合久鬼88| 日韩高清有码在线| 亚洲国模精品一区| 欧美激情精品久久久| 亚洲男人天堂手机在线| 日本免费一区二区三区视频观看| 久久伊人精品一区二区三区| 亚洲伊人第一页| 国产精品欧美日韩| 亚洲片在线观看|