作业要求:
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之间的数据共享;
一、功能说明
实现界面展示:
将两个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项目中传递的数据;
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页面点击“接收”按钮
在MyContentProvider中查看App Inspection下的“wmyDB”数据库中的“student”表中的数据。
四、实验总结
本次实验通过ContentProvider一些功能实现不同app之间的数据共享。这次实验相比于之前的实验难度较大。即使跟着老师演示操作,还是容易有疏忽然后一直报错,要注意的是要进行数据共享必须两个项目一起运行。其中创建数据库和表格都是运用的之前学过的知识,而对Contentprovder的使用让我对他印象深刻,我明白了要如何使用其方法类进行数据获取,以及一些数据存储的有关知识。
跟随老师还学习了资源标志符(Universal Resource Identifier, 简称"URI")的使用,Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。这次实验的最大收获是学会了数据共享。ContentProvider项目对外共享数据, 我们可以通过ContentProvider把应用中的数据共享给其他应用访问,Resolver项目请求数据,两个项目互相作用完成数据共享。但是一些操作我还是不熟悉,我会通过课后的资料搜集和补充,对没有掌握好的内容进行学习。