移动开发-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 {

    @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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值