Android 4 學習(17):使用Content Resolver
Content Resolver簡介
每個應用程式都有一個ContentResolver例項,通過getContentResolver()方法可以獲取:
ContentResolver cr = getContentResolver();
與Content Provider對應,Content Resolver用於使用Content Provider釋出的資料。使用ContentResolver查詢ConentProvider提供的資料:
// Get the Content Resolver. ContentResolver cr = getContentResolver();// Specify the result column projection. Return the minimum set of columns required to satisfy your requirements. String[] result_columns = new String[] { MyHoardContentProvider.KEY_ID, MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };// Specify the where clause that will limit your results. String where = MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + “=” + 1; // Replace these with valid SQL statements as necessary. String whereArgs[] = null; String order = null; // Return the specified rows. Cursor resultCursor = cr.query(MyHoardContentProvider.CONTENT_URI, result_columns, where, whereArgs, order);
從Cursor中解析資料的方法和上一篇博文中介紹的一樣,首先要移動到指定行,然後從指定列中獲取對應型別的資料:
float largestHoard = 0f; String hoardName = “No Hoards”; // Find the index to the column(s) being used. int GOLD_HOARDED_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow( MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN); int HOARD_NAME_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow( MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN); // Iterate over the cursors rows. // The Cursor is initialized at before first, so we can // check only if there is a “next” row available. If the // result Cursor is empty, this will return false. while (resultCursor.moveToNext()) { float hoard = resultCursor.getFloat(GOLD_HOARDED_COLUMN_INDEX); if (hoard > largestHoard) { largestHoard = hoard; hoardName = resultCursor.getString(HOARD_NAME_COLUMN_INDEX); } } // Close the Cursor when you’ve finished with it. resultCursor.close();
使用Cursor Loader進行非同步查詢
Cursor Loader存在於在每個Activity和Fragment中,可以實現非同步查詢和監聽底層資料的變化。例如管理Cursor的生命週期,確保在Activity退出之前Cursor被關閉。
實現LoaderCallbacks介面
若要使用Cursor Loader,首先要實現LoaderManager.LoaderCallbacks介面:
LoaderManager.LoaderCallbacks<Cursor> loaderCallback = new LoaderManager.LoaderCallbacks<Cursor>()
LoaderCallback主要有這幾個回撥方法:
- onCreateLoader
- onLoadFinished
- onLoaderReset
public Loader<Cursor> onCreateLoader(int id, Bundle args) { // Construct the new query in the form of a Cursor Loader. Use the id // parameter to construct and return different loaders. String[] projection = null; String where = null; String[] whereArgs = null; String sortOrder = null; // Query URI Uri queryUri = MyContentProvider.CONTENT_URI; // Create the new Cursor loader. return new CursorLoader(DatabaseSkeletonActivity.this, queryUri,projection, where, whereArgs, sortOrder); } public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // Replace the result Cursor displayed by the Cursor Adapter with the new result set. adapter.swapCursor(cursor); // This handler is not synchronized with the UI thread, so you will need to synchronize it before modifying any UI elements directly. } public void onLoaderReset(Loader<Cursor> loader) { // Remove the existing result Cursor from the List Adapter. adapter.swapCursor(null); // This handler is not synchronized with the UI thread, so you // will need to synchronize it before modifying any UI elements directly. }
初始化和重啟Cursor Loader
在Activity和Fragment中,可以呼叫getLoaderManager獲得Cursor Loader
LoaderManager loaderManager = getLoaderManager();
獲取Cursor Loader:
Bundle args = null; loaderManager.initLoader(LOADER_ID, args, myLoaderCallbacks);
LOADER_ID用於標識獲得的loader,args是可選引數,myLoaderCallbacks則是前面LoaderManager.LoaderCallbacks介面的實現。如果對應LOADER_ID的Cursor Loader不存在,那麼系統會呼叫onCreateLoader方法來建立一個Loader。
使用Content Resolver增、改、刪
插入資料:
// Create a new row of values to insert. ContentValues newValues = new ContentValues(); // Assign values for each row. newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName); newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue); newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible); // [ ... Repeat for each column / value pair ... ] // Get the Content Resolver ContentResolver cr = getContentResolver(); // Insert the row into your table Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);
刪除資料:
// Specify a where clause that determines which row(s) to delete. // Specify where arguments as necessary. String where = MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN + “=” + 0; String whereArgs[] = null; // Get the Content Resolver. ContentResolver cr = getContentResolver(); // Delete the matching rows int deletedRowCount = cr.delete(MyHoardContentProvider.CONTENT_URI, where, whereArgs);
修改資料:
// Create the updated row content, assigning values for each row. ContentValues updatedValues = new ContentValues(); updatedValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, newHoardValue); // [ ... Repeat for each column to update ... ] // Create a URI addressing a specific row. Uri rowURI = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, hoardId); // Specify a specific row so no selection clause is required. String where = null; String whereArgs[] = null; // Get the Content Resolver. ContentResolver cr = getContentResolver(); // Update the specified row. int updatedRowCount = cr.update(rowURI, updatedValues, where, whereArgs);
使用Content Resolver讀寫Content Provider中的資料
public void addNewHoardWithImage(String hoardName, float hoardValue, boolean hoardAccessible, Bitmap bitmap) { // Create a new row of values to insert. ContentValues newValues = new ContentValues(); // Assign values for each row. newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName); newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue); newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible); // Get the Content Resolver ContentResolver cr = getContentResolver(); // Insert the row into your table Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues); try { // Open an output stream using the new row’s URI. OutputStream outStream = cr.openOutputStream(myRowUri); // Compress your bitmap and save it into your provider. bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream); }catch (FileNotFoundException e) { Log.d(TAG, “No file found for this record.”); } } public Bitmap getHoardImage(long rowId) { Uri myRowUri = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, rowId); try { // Open an input stream using the new row’s URI. InputStream inStream = getContentResolver().openInputStream(myRowUri); // Make a copy of the Bitmap. Bitmap bitmap = BitmapFactory.decodeStream(inStream); return bitmap; }catch (FileNotFoundException e) { Log.d(TAG, “No file found for this record.”); } return null; }
相關推薦
Android 4 學習(17):使用Content Resolver
Content Resolver簡介 每個應用程式都有一個ContentResolver例項,通過getContentResolver()方法可以獲取: ContentResolver cr = getContentResolver(); 與Content Provider對應,Cont
Android 4 學習(21):對話方塊
對話方塊 建立Dialog的兩種方式: 1. 使用Dialog類或其子類,包括DialogFragment 2. 在Activity中使用Dialog主題(theme) 下面是使用Dialog類的一個例子: // Create the new Dialog.Dialog dialog = n
Android 4 學習(18):搜尋
參考《Professional Android 4 Development》 搜尋 通過下面這幾種方式可以給應用程式新增搜尋功能: Search Bar Search View Quick Search Box 可搜尋的Content Provider 首
Android 4 學習(20):ActionBar
參考《Pro Android 4.0》 ActionBar 11.0之後,ActionBar在Activity中預設存在,可以在程式碼中設定其顯示與否: ActionBar actionBar = getActionBar(); // Hide the Action Bar actionBa
Android 4 學習(19):Services
參考《Professional Android 4 Development》 Services Service是invisible的,因此其優先順序不高於visible的Activity,之所以說不高於,是因為我們可以設定Service為在前臺執行。 建立Service Android提供了Ser
Android 4學習(7):使用者介面
參考《Professional Android 4 Development》 Android UI基本元素 下面這些概念是Android UI設計的基礎,深入學習和理解它們是Android UI設計的基礎: View:View是所有UI元素,包括Layout在內,的父
Android 4學習(6):概述
參考:《Professional Android 4 Application Development》 深入瞭解Android Activity 每一個Android Activity都對應於一個使用者介面(UI)。每個Android Application都有一個m
Linux命令學習(17):ifconfig命令
廣播 參考 vip 統計 協議 cnblogs 還需要 pro 網絡 版權聲明更新:2017-05-22博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 我們知道,在windows中,
Android NDK學習(二):編譯腳本語法Android.mk和Application.mk
GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義
Android Camera學習(一):如何實現轉動螢幕介面選單跟著轉動效果
最近公司在做車載專案,需要把照相機原本豎向顯示改為橫向顯示。所以研究了下camera選單朝向的問題。 系統提供了一個監聽sensor狀態變化的類OrientationEventListener。在系統程式碼CameraActivity中就是繼承的這個類。 private
Android BLE學習(三):編寫自己的 BLE藍芽讀寫工具(功能仿照nrf master control panel)
背景 由於nordic官方的nrf master control panel只提供了apk,很多同學學習起來都得自己摸索藍芽的讀寫,專案中整理了BLE模組的基本讀寫方法以及一些常用的UUID,並且抽取了一些藍芽操作的流程,方便Android app程式碼開發,
Android BLE學習(一): Android搜尋BLE裝置
背景 總結一下最近ble的學習情況。自從入手ble 51822開發板後就開始不停加班,中途出於好奇,業餘時間寫了一些微控制器上json解析相關的東西,妄圖使用藍芽傳輸json資料,不知道是否實用,既然開始寫了,得寫出點樣子,晃晃蕩蕩,2016年的1月份就過去了
Android 8.0 學習(17)---Android8.0中對指紋的新要求
我們先來看一張指紋在Android6.0版本上的架構層次圖:指紋應用層,也就是手機上的指紋設定,這是Android系統層定義的指紋管理入口。1,system/core/rootdir/init.rc中啟動system/core/Fingerprintd指紋的守護程序。fingerprintd的程式碼實現如下目
ROS 進階學習筆記(17):ROS導航2:關於 move_base Package(底盤移動包)
== 關於move_base 包(底盤移動包?移動底盤包?) == 開始之前,我[email protected]有幾個問題(Link on ROS_Answer)需要搞定: costmap_2d包 與 move_base包 是什麼關係?導航時,在RviZ工具中,
linux命令學習(6):ps命令
bytes 釋放 ice cti width kthread hellip 名稱 pts Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要
JAVA學習(七):方法重載與方法重寫、thiskeyword和superkeyword
格式 hello new 初始 per 而且 方法重寫 學習 方式 方法重載與方法重寫、thiskeyword和superkeyword 1、方法重載 重載可以使具有同樣名稱但不同數目和類型參數的類傳遞給方法。 註: 一是重載方法的參數列表必須與被重載的方法不同
ArcGIS API for JavaScript學習(1):第一個地圖
樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一
Java學習(2):將鍵盤錄入的內容保存到指定文件中
stream exce 創建 txt 關閉 如果 下午 line 再次 要求:保存鍵盤錄入的內容,當鍵盤輸入end時,錄入結束。 1 /** 2 * 保存鍵盤輸入,並以end結束 3 * 4 * @author xcx 5 * @time 2017年6
Shiro學習(17)OAuth2集成
ans -c 後臺 異常檢測 創建客戶端 下載 完成 weibo blank 目前很多開放平臺如新浪微博開放平臺都在使用提供開放API接口供開發者使用,隨之帶來了第三方應用要到開放平臺進行授權的問題,OAuth就是幹這個的,OAuth2是OAuth協議的下一個版本,相比OA
RabbitMQ學習(六):遠程結果調用
cells actor ble 隨機 get getenv all 求和 int 場景:我們需要在傳輸消息時得到結果 客服端在發送請求時會發送回調隊列,服務端處理事情完成後會將結果返回到回調隊列中,在增加關聯標誌關聯每個請求和服務返回 客戶端代碼: public