移动开发-contentprovider进行数据获取
目錄
設計目標
功能說明?
代碼解析
?Myresolver
MainActivity
?AndroidManifest.xml
ContentProvider
?MyDBhelper
?MyDAO
?MyContentProvider
?實驗結果
?實驗總結
gitee的代碼倉庫的地址?
設計目標
contentprovider是安卓四大組件之一,請使用其方法類進行數據獲取;
建一個provider,然后在另一個app中使用resolver調用這個provider。
實現數據獲取并得到正確結果
功能說明?
? ? ? ?首先new兩個Empty Activity的Project分別命名為Myresolver和ContentProvider。
? ? ? ?對于每一個應用程序來說,如果想要訪問內容提供器中共享的數據,就一定要借助Content-Resolver類,可以通過Context中的getContentResolver()方法獲取到該類的實例。Content-Resolver中提供了一系列的方法用于對數據進行CRUD操作,其中insert()方法用于添加數據,update()方法用于更新數據,delete()方法用于刪除數據,query()方法用于查詢數據。不同于SQLiteDatabase, ContentResolver中的增刪改查方法都是不接收表名參數的,而是使用一個Uri參數代替,這個參數被稱為內容URI。內容URI給內容提供器中的數據建立了唯一標識符,它主要由兩部分組成:authority和path。而我在Myresolver中實現了添加數據的操作。
? ? ? ?內容提供器(Content Provider)主要用于在不同的應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪數據的安全性。目前,使用內容提供器是Android實現跨程序共享數據的標準方式。ContentProvider是Android四大組件之一,其本質上是一個標準化的數據管道,它屏蔽了底層的數據管理和服務等細節,以標準化的方式在Android 應用間共享數據。用戶可以靈活實現ContentProvider所封裝的數據存儲以及增刪改查等,所有的ContentProvider 必須實現一個對外統一的接口(URI)。使用的時候需要在androidmanifest.xml文件中注冊provider。我在ContentProvider中增加了MyDBhelper用來初始化數據庫,MyContentProvider為新建的一個類取繼承ContentProvider的方式來創建一個自己的內容提供器并重寫了相關內容,MyDAO來完成數據和uri的相關問題
以下分別為ContentProvider和Myresolver的相關文件
?
?
代碼解析
?Myresolver
MainActivity
通過Context中的getContentResolver()方法獲取到該類的實例
ContentResolver resolver=getContentResolver();
然后用
Uri uri=Uri.parse("content://zty.provider1/student");來表明uri的內容
用ContentValues values=new ContentValues();來填寫相關內容
最后使用resolver.insert(uri,values);來實現數據的插入工作,具體代碼如下
?
package com.example.myresolver;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentResolver; import android.content.ContentValues; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=findViewById(R.id.button);ContentResolver resolver=getContentResolver();Uri uri=Uri.parse("content://zty.provider1/student");ContentValues values=new ContentValues();values.put("name","zty");values.put("age",20);values.put("sex","男");button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {resolver.insert(uri,values);}});} }?AndroidManifest.xml
為了提高安全性會進行權限配置,而其中的名字可以在創建的ContentProvider中找到
<queries><package android:name="com.example.contentprovider"></package></queries>?
ContentProvider
?MyDBhelper
?用于初始化數據庫,數據庫名為ztyDB,表名為student并進行了表的相關設定,代碼如下?
package com.example.contentprovider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;import androidx.annotation.Nullable;public class MyDBhelper extends SQLiteOpenHelper {public MyDBhelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, "ztyDB", null, version);Log.d("zty","MyDBhelper is running....");}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL("create table student(" +"id integer primary key AUTOINCREMENT,name varchar(20),age integer,sex varchar(20) )");Log.d("zty","onCreate is running....");}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}?MyDAO
?新建一個java class命名為MyDAO作為數據庫訪問類,首先定義了構造方法,參數為上下文,使用到了前面定義的數據庫,并使用getWritableDatabase來返回一個數據庫可讀寫對象database,然后新建一個ztyInsert的方法函數用于往數據庫力傳參數。insert的返回類型是long,用ContentUris的withAppendedId方法將id追加到Uri后面返回到contentresolver的insert中,用inserturi來接受參數。在數據庫發生變化的時候我們調用notifyChange方法,及時更新,通知那個uri數據發生了變化,以便及時更新頁面。?代碼如下
package com.example.contentprovider;import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.util.Log;public class MyDAO {private SQLiteDatabase database;Context context;private Uri uri=Uri.parse("content://zty.Provider1");public MyDAO(Context context){this.context=context;MyDBhelper dBhelper=new MyDBhelper(context,"ztyDB",null,1);database=dBhelper.getWritableDatabase();}public Uri ztyInsert(){ContentValues values=new ContentValues();values.put("name","納西妲");values.put("age",21);values.put("sex","女");long id=database.insert("student",null,values);Uri inserturi = ContentUris.withAppendedId(uri, id);context.getContentResolver().notifyChange(inserturi,null);return inserturi;}}?MyContentProvider
新建的一個類來繼承ContentProvider的方式來創建一個自己的內容提供器,?其中的
URI Anthorities要填寫正確需要的內容,我填的為zty.provider1.在其中有6中抽象方法,我們本次只需要填寫噢onCreate和insert兩種方法,只有當Myresolver嘗試訪問數據時,才會被初始化。在insert中運用MyDAO中的ztyInsert中的數據來添加,返回一個新的URI。代碼如下
package com.example.contentprovider;import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri;public class MyContentProvider extends ContentProvider {private MyDAO myDAO;private Context context;public MyContentProvider() {}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO: Implement this to handle requests to insert a new row.return myDAO.ztyInsert();}@Overridepublic boolean onCreate() {// TODO: Implement this to initialize your content provider on startup.context=this.getContext();myDAO=new MyDAO(context);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO: Implement this to handle query requests from clients.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException("Not yet implemented");} }?實驗結果
?
?
?實驗總結
? ? ? ?這次的實驗還是一個比較難的操作,在實驗中出現了很多問題,開始時代碼都寫好了,不報錯,但是一運行就會出現錯誤,后來才發現運行時要把兩個app都運行不能只運行一個,還有就是要在?AndroidManifest.xml填寫正確的packge名,能夠正確識別并找到位置。也讓我對于Contentprovder的理解更加深刻,對于數據存儲的有關知識也有了更深的理解。uri也是一個很重要的內容。通用資源標志符(Universal Resource Identifier, 簡稱"URI")。Uri代表要操作的數據,Android上可用的每種資源 (圖像、視頻片段、網頁等) 都可以用Uri來表示。從概念上來講,URI包括URL。Uri的通用格式為:scheme: scheme-specific-part #fragment。
? ? ? 對于數據跨應用的運用有了初步的了解,通過不斷的學習將會有更深入的理解。resolver
和contentprover兩個互相作用的過程有了初步的認知。對于添加的操作還是有一些陌生,但在老師的細心教導下還是做了出來,以后會學習相關知識自己完成更新,刪除等操作。
?
gitee的代碼倉庫的地址?
https://gitee.com/zhang-tian_yu/Android.git
總結
以上是生活随笔為你收集整理的移动开发-contentprovider进行数据获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mui调用摄像头
- 下一篇: 度为n的不可约多项式和Fp^n 这个域的