概述
目录
设计目标
功能说明
代码解析
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 {
@Override
protected 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() {
@Override
public 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....");
}
@Override
public 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....");
}
@Override
public 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() {
}
@Override
public 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");
}
@Override
public 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");
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO: Implement this to handle requests to insert a new row.
return myDAO.ztyInsert();
}
@Override
public boolean onCreate() {
// TODO: Implement this to initialize your content provider on startup.
context=this.getContext();
myDAO=new MyDAO(context);
return true;
}
@Override
public 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");
}
@Override
public 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进行数据获取设计目标功能说明 代码解析 实验结果 实验总结gitee的代码仓库的地址 的全部内容,希望文章能够帮你解决移动开发-contentprovider进行数据获取设计目标功能说明 代码解析 实验结果 实验总结gitee的代码仓库的地址 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复