作业要求: 

1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;

2、请自建一个provider,然后在另一个app中使用resolver调用这个provider。

3、本次作业请启用新项目,理论上需要两个APP进行实验。

主要内容:

       设计目标、功能说明、代码解析、运行展示截图、源码仓库地址;

目录

设计目标

一、功能说明

二、功能实现及代码解析

(一)请求方MyResolver 

1、activity_main.xml进行UI设计

2、mainactivity.java插入数据功能

(二)提供方MyContentProvider

1、MyDBhelper.java初始化数据库

2、MyDAO.java实例化数据库

3、MyContentProvider.java实现增添数据功能

4、MyContentProvider.java实现增添数据功能

5、AndroidManifest.xml 

三、运行展示截图

四、实验总结

五、源码仓库地址


设计目标

内容要求:自建一个provider,然后在另一个app中使用resolver调用这个provider。创建两个APP,一个MyResolver和一个MyContentProvider,实现请求方MyResolver调用提供方MyContentProvider对表格进行数据添加。
技术实现: 使用contentprovider来实现app之间的数据共享;


一、功能说明

实现界面展示:

Android studio大作业报告计算器 android课程大作业_java

       将两个APP同时运行,当我们在resolver页面点击“接收”按钮,在MyContentProvider中查看App Inspection下的wmyDB数据库中的student表。

二、功能实现及代码解析

        我们需要创建两个项目,一个MyResolver和一个MyContentProvider,以此来使用contentprovider实现app之间的数据共享,即可以在一个app中访问另一个app的数据。

(一)请求方MyResolver 

1、activity_main.xml进行UI设计

        我们在activity_main.xml中设计MyResolver app界面,点击一次button按钮INSERT,数据库中student表就会添加一组resovler项目中传递的数据;

Android studio大作业报告计算器 android课程大作业_android_02

 

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="resolver"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.402"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.29" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="insert"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.41"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        app:layout_constraintVertical_bias="0.401" />

</androidx.constraintlayout.widget.ConstraintLayout>

2、mainactivity.java插入数据功能

        我们在mainactivity.java中完成向contentprovider中创建的数据库中插入数据的功能,插入一条数据{name=‘wmy’,age=‘18’,sex=‘女’}。建立URI,使按钮实现点击效果。

mainactivity.java代码:

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://wmy.provider2/student");
        ContentValues values=new ContentValues();
        values.put("name","wmy");
        values.put("age",19);
        values.put("sex","女");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                resolver.insert(uri,values);
            }
        });
    }
}

(二)提供方MyContentProvider

1、MyDBhelper.java初始化数据库

        我们在MyDBhelper.java中初始化数据库,数据库名为“wmyDB”,新建表名为“student”并对表进行相关设置。

MyDBhelper.java代码:

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, "wmyDB", null, version);
        Log.d("wmy","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("wmy","onCreate is running....");
    }

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

    }

}

2、MyDAO.java实例化数据库

        我们在MyDAO.java中实例化数据库,使数据库为可写状态,还可以对数据库数据进行写入操作。我们在MyDAO.java中使用getWritableDatabase来返回一个数据库刻度写对象database,然后新建一个wmyInsert的方法函数给数据库传参数。在数据库发生变化的时候我们调用notifyChange方法及时更新,通知那个uri数据发生了变化,以便我们来及时更新页面。

MyDAO.java代码:

package com.example.contentprovider;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;

public class MyDAO {
    private SQLiteDatabase database;
    Context context;

    public MyDAO(Context context)
    {
        MyDBhelper dBhelper=new MyDBhelper(context,"wmyDB",null,1);
        this.context=context;
        database=dBhelper.getWritableDatabase();

    }



    public Uri wmyInsert(ContentValues contentValues){
        ContentValues values=new ContentValues();
        values.put("name","雨曦");
        values.put("age",20);
        values.put("sex","女");
        Uri uri=Uri.parse("content://wmy.Provider2/student");

      long id=database.insert("student",null,contentValues);
        Uri  inserturi=ContentUris.withAppendedId(uri,id);
        context.getContentResolver().notifyChange(inserturi,null);
        return inserturi;
    }





}

       

3、MyContentProvider.java实现增添数据功能

        我们在MyContentProvider.java里面实例化DAO类,实现增添数据操作。我们新建的一个类来继承ContentProvider的方式来创建一个自己的内容提供器, 我们写入onCreate和insert两种方法,只有当Myresolver尝试访问数据时,才会被初始化。然后我们在insert中运用MyDAO中的wmyInsert中的数据来添加,返回一个新的URI。

MyContentProvider.java代码:

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 contex;
    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.
       //getContext().getContentResolver().insert(uri, values);
       return myDAO.wmyInsert(values);
    }

    @Override
    public boolean onCreate() {
        // TODO: Implement this to initialize your content provider on startup.
        contex=this.getContext();
        myDAO=new MyDAO(contex);
        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");
    }
}

4、MyContentProvider.java实现增添数据功能

        我们在MyContentProvider.java里面实例化DAO类,实现增添数据操作。我们新建的一个类来继承ContentP

MyContentProvider.java代码:

package com.example.contentprovider;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
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);
        Context context=this;

        MyDAO myDAO=new MyDAO(context);


    }
}

5、AndroidManifest.xml 

        为了提高安全性会进行权限配置,而其中的名字可以在创建的ContentProvider中找到

<queries>
       <package android:name="com.example.contentprovider"></package>
   </queries>

三、运行展示截图

先将MyResolver和MyContentProvider两个app同时启动,然后在resolver页面点击“接收”按钮

Android studio大作业报告计算器 android课程大作业_java_03

在MyContentProvider中查看App Inspection下的“wmyDB”数据库中的“student”表中的数据。

Android studio大作业报告计算器 android课程大作业_ide_04

 

四、实验总结

        本次实验通过ContentProvider一些功能实现不同app之间的数据共享。这次实验相比于之前的实验难度较大。即使跟着老师演示操作,还是容易有疏忽然后一直报错,要注意的是要进行数据共享必须两个项目一起运行。其中创建数据库和表格都是运用的之前学过的知识,而对Contentprovder的使用让我对他印象深刻,我明白了要如何使用其方法类进行数据获取,以及一些数据存储的有关知识。

        跟随老师还学习了资源标志符(Universal Resource Identifier, 简称"URI")的使用,Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。这次实验的最大收获是学会了数据共享。ContentProvider项目对外共享数据, 我们可以通过ContentProvider把应用中的数据共享给其他应用访问,Resolver项目请求数据,两个项目互相作用完成数据共享。但是一些操作我还是不熟悉,我会通过课后的资料搜集和补充,对没有掌握好的内容进行学习。