什么是ContentProvider?
ContentProvider是内容提供商或者内容提供器,是Android四大组件之一。
通常是用于多个APP之间的交互。跨APP之间的交互。
同样有对应的内容接收方——ContentResolver接收
这么使用ContentProvider?
在manifest里
<application
<provider
android:enabled="true"
android:exported="true"//把信息暴露出来
android:authorities="com.example.abc.studentdemo"//路径(暗号)
android:name=".Myprovider"/>//文件
</application>
新建类继承ContentProvider
首先类里要有数据库
Myprovider代码展示:
package com.example.abc.studentdemo;
import android.app.AlertDialog;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.EditText;
import com.example.abc.studentdemo.db.DBHelper;
/**
* Created by Administrator on 2018/3/29.
*/
public class Myprovider extends ContentProvider {
private String TAG="student";
private static final int Table_Dir = 0;//静态常量有final变为不可变
private static final int Table_Item = 1;//这样写到下面返回时可以根据返回的值来判断要查的值
private static final int Table2_Dir = 2;
private static final int Table2_Item = 3;
private static UriMatcher uriMatcher;
static {//静态代码块(数据表多的时候需要)
//uriMatcher 验证(暗号)+(干啥)
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.app.provider", "table1", Table_Dir);
uriMatcher.addURI("com.example.app.provider", "table1/#", Table_Item);
uriMatcher.addURI("com.example.app.provider", "table2", Table2_Dir);
uriMatcher.addURI("com.example.app.provider", "table2/#", Table2_Item);
}
@Override
public boolean onCreate() {
Log.e(TAG, "onCreate: ...................." );
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
Log.e(TAG, "query: ...................." );
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.e(TAG, "getType: ...................." );
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
Log.e(TAG, "insert: ...................." );
DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);//数据库
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();//写数据
sqLiteDatabase.insert("student",null,contentValues);
//从另一个工程中传的值放到这用来操作数据库
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "delete: ...................." );
DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
sqLiteDatabase.delete("student","name=?",strings);
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "update: ...................." );
return 0;
}
}
另一个工程代码展示:
package com.example.abc.providerdemo;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
private Button btn1;
private Button btn2;
private Button btn3;
private EditText edi;
private ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
}
private void bindID() {
btn = findViewById(R.id.main_btn);
btn1 = findViewById(R.id.main_btn1);
btn2 = findViewById(R.id.main_btn2);
btn3 = findViewById(R.id.main_btn3);
edi=findViewById(R.id.main_edi);
btn.setOnClickListener(this);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.main_btn://插入
Uri uri= Uri.parse("content://com.example.abc.studentdemo");
//Uri=content://+路径+资源地址(有一个没必要,如果数据表多的时候要资源地址)这时候在继承类中的静态代码块就有用了
ContentValues values=new ContentValues();//存储
values.put("name",edi.getText().toString());
resolver=getContentResolver();//新建ContentResolver
resolver.insert(uri,values);//传值
break;
case R.id.main_btn1:
Uri uri1 = Uri.parse("content://com.example.abc.studentdemo");
ContentValues values1=new ContentValues();
values1.put("name",edi.getText().toString());
resolver = getContentResolver();
resolver.delete(uri1, "name=?", new String[]{edi.getText().toString()});
break;
case R.id.main_btn2:
break;
case R.id.main_btn3:
break;
}
}
}