一、设计目标
使用contentprovider的方法类进行数据获取。自建一个provider,然后在另一个app中使用resolver调用这个provider。
二、功能说明
首先,定义一个继承自contentProvider的MyContentProvider类,并实现其中的六个方法它们分别为:OnCreate()、getType()、insert()、updata()、delete()、query()。
创建一个MyResolver类去访问ContentProvider中的数据, 即通过MyResolver类去操作不同的ContentProvider中的数据。在MyResolver类的onCreate()方法中,我们可以通过Context中的getContentResolver方法去获得一个系统的ContentResolver的实例。provider可以用于把要用的表用uri表示出来。
MyContent是对数据库的操作方法不想暴露出去,通过uri来进行对数据库的操作,uri隐藏了数据库的名字,在DAO中封装能够对数据库的created 。用MyDBhelper做数据库的创建和连接。
三、代码解析
MyResolver.java:
package com.example.myresolver_1116;
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 {
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver resolver=getContentResolver();
//获得到了一个系统的ContentResolver
Uri uri= Uri.parse("content://hxy.provider2/student");
//provider用于把要用的表用uri表示出来
ContentValues values=new ContentValues();
values.put("name","hxy");
values.put("age",20);
button1.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resolver.insert(uri,values);
}
});
}
}
MyContentProvider.java:
package com.example.provider_1116;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
public class MyContentProvider extends ContentProvider {
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.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public boolean onCreate() {
// TODO: Implement this to initialize your content provider on startup.
return false;
}
@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");
}
}
MyDAO.java
package com.example.provider_1116;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
private Context context;//创建一个context去收到传过来的context的值
private SQLiteDatabase database;
public MyDAO(Context context){
this.context=context;
MyDBhelper dbhelper=new MyDBhelper(context,"hxyDB",null,1);
SQLiteDatabase database=dbhelper.getWritableDatabase();
}
public Uri hxyInsert(ContentValues values){
Uri uri=Uri.parse("content://hxy.provider2/student");
long rowId=database.insert("student",null,values);
//把行地址用当前uri形式表示出来
Uri inserturi = ContentUris.withAppendedId(uri,rowId);
// ContentUri做content中uri的管理
context.getContentResolver().notifyChange(inserturi,null);
return inserturi;
}
}
MyDBhelper.java:
package com.example.provider_1116;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
//MyDBhelper灰色表示MyDBhelper这个类没有被用过,所以可以去Activity(MyDBhelper)里面调用
public class MyDBhelper extends SQLiteOpenHelper {
public MyDBhelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context,"hxyDB", null, version);
//name数据库名,factory游标null;
}
@Override
//必须要一个数据库对象sqLiteDatabase,才能去调用数据库
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//最简单的执行sql的语句,()里面写sql语句
sqLiteDatabase.execSQL("create table student(id integer primary key autoincrement,name varchar(20),age integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}