ContentProvider(作业三)

一、介绍

Content Provider是 Android 四大组件之一,主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。
不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

 二、实验

1.用作Provider的app

主要作用:定义一个数据库,提供数据

主要文件:

MySqlite.java

package com.example.sqlitetest;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

public class MySqlite {
    private Context context;
    private SQLiteDatabase database;
    public MySqlite(Context context){
        this.context=context;
        MyDatabase dbhelper=new MyDatabase(context,"db",null,1);
        database=dbhelper.getWritableDatabase();
    }
    public Uri Daoinsert(ContentValues contentValues){
        long rowid=database.insert("student",null,contentValues);
        Uri uri=Uri.parse("content://com.example.provider.MyContentProvider/student");
        Uri inserturi= ContentUris.withAppendedId(uri,rowid);
        context.getContentResolver().notifyChange(inserturi,null);
        return inserturi;
    }
    public Cursor query(String[] whichone, String selection, String[] selectionArgs, String sortOrder) {
        Cursor cursor1 = database.query("student",whichone,selection,selectionArgs,
                null,null,sortOrder);

        return cursor1;
    }
}

Mydatabase.java

package com.example.sqlitetest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class MyDatabase extends SQLiteOpenHelper {
    public MyDatabase(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table student ("+"id integer primary key autoincrement,name varchar,age integer)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

MyContentProvider.java

package com.example.sqlitetest;


import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class MyContentProvider extends ContentProvider {
    private MySqlite MySqlite;
    public MyContentProvider(){

    }
    @Override
    public boolean onCreate() {
        MySqlite=new MySqlite(this.getContext());
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        return MySqlite.query(strings,s,strings1,s1);

    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return "1";
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        getContext().getContentResolver().insert(uri,contentValues);
        return MySqlite.Daoinsert(contentValues);
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }
}

2.用作Resovler的app

主要作用:接收其他app的数据并输出

主要文件:

package com.example.providertest;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private String d="";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button_resovel);
        TextView textView=findViewById(R.id.textView_resovel);

        ContentResolver resolver = getContentResolver();
        ContentValues values= new ContentValues();
        values.put("name","sb");
        values.put("age","20");

        Uri uri = Uri.parse("content://com.example.sqlitetest.MyContentProvider/student");

//        button.setOnClickListener(v -> resolver.insert(uri,values));

        button.setOnClickListener(v -> {
                    Cursor cursor = resolver.query(uri, null, null, null, null);
                    while (cursor.moveToNext()) {
                        @SuppressLint("Range") String name = cursor.getString(cursor.
                                getColumnIndex("name"));
                        @SuppressLint("Range") int age = cursor.getInt(cursor.
                                getColumnIndex("age"));
                        @SuppressLint("Range") int id = cursor.getInt(cursor.
                                getColumnIndex("id"));
                        d += ("id=" + id + "  name=" + name + "  age=" + age);
                    }
                    textView.setText(d);
                }
        );
    }
}

三、结果

先运行数据库插入数据

然后运行作为Resovler的app

执行结果

截图演示:

四、代码仓库

Provider

Resovler

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值