安卓自定义ContentProvider
MyProvider.java
package com.example.contentprovider2demo;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyProvider extends ContentProvider {
MySQLiteDBHelper dbHelper;
SQLiteDatabase db;
public static final String AUTHORITY="com.example.contentprovider2demo.provider";
public static final int USER_DIR=0;
public static final int USER_ITEM=1;
//content://com.example.contentprovider2demo.provider/user
private static UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY,"user",USER_DIR);
uriMatcher.addURI(AUTHORITY,"user/#",USER_ITEM);
}
@Override
public boolean onCreate() {
dbHelper =new MySQLiteDBHelper(getContext(),"user.db",null,1);
db =dbHelper.getWritableDatabase();//获取可写的数据库
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Cursor cursor=null;
switch (uriMatcher.match(uri)){
case USER_DIR:
cursor=db.query("user",projection,selection,selectionArgs,null,null,null);
break;
case USER_ITEM:
String queryId =uri.getPathSegments().get(1);
cursor=db.query("user",projection,"_id =?",new String[]{queryId},null,null,null);
break;
}
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)){
case USER_DIR:
return "vnd.android.cursor.dir/com.example.contentprovider2demo.provider.user";
case USER_ITEM:
return "vnd.android.cursor.item/com.example.contentprovider2demo.provider.user";
default:
break;
}
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
switch (uriMatcher.match(uri)){
case USER_DIR:
case USER_ITEM:
long rawUserId =db.insert("user",null,values);
break;
default:
break;
}
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
int rawUserId=0;
switch (uriMatcher.match(uri)){
case USER_DIR:
rawUserId =db.delete("user",selection,selectionArgs);
break;
case USER_ITEM:
String deleteId = uri.getPathSegments().get(1);
rawUserId =db.delete("user","_id =?",new String[]{deleteId});
break;
default:
break;
}
return rawUserId;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
int rawUserId=0;
switch (uriMatcher.match(uri)){
case USER_DIR:
rawUserId =db.update("user",values,selection,selectionArgs);
break;
case USER_ITEM:
String updateId = uri.getPathSegments().get(1);
rawUserId =db.update("user",values,"_id =?",new String[]{updateId});
break;
default:
break;
}
return rawUserId;
}
}
MySQLiteDBHelper.java
package com.example.contentprovider2demo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MySQLiteDBHelper extends SQLiteOpenHelper {
public MySQLiteDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql ="CREATE TABLE user(_id integer primary key autoincrement," +
"username text not null," +
"phonenumber text not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity.java
package com.example.contentprovider2demo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView textView;
EditText userName,photo;
Button insert,update,delete,query,queryAll;
Uri uri =Uri.parse("content://com.example.contentprovider2demo.provider/user");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =findViewById(R.id.textView);//显示查询出的数据
insert =findViewById(R.id.insertBtn);//添加按钮
update =findViewById(R.id.updateBtn);//修改按钮
delete =findViewById(R.id.deleteBtn);//删除
query =findViewById(R.id.querytBtn);//查询
queryAll =findViewById(R.id.queryAllBtn);//查询全部
userName =findViewById(R.id.userName);//用户输入
photo =findViewById(R.id.photo);//密码输入
insert.setOnClickListener(new mClick());
update.setOnClickListener(new mClick());
delete.setOnClickListener(new mClick());
query.setOnClickListener(new mClick());
queryAll.setOnClickListener(new mClick());
}
private class mClick implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.insertBtn:
insert();
break;
case R.id.updateBtn:
update();
break;
case R.id.deleteBtn:
delete();
break;
case R.id.querytBtn:
query();
break;
case R.id.queryAllBtn:
queryAll();
break;
}
}
//新增
void insert(){
String name =userName.getText().toString();
String phone =photo.getText().toString();
ContentValues values =new ContentValues();
values.put("username",name);
values.put("phonenumber",phone);
getContentResolver().insert(uri,values);
Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_LONG).show();
}
//修改
void update(){
String name =userName.getText().toString();
String phone =photo.getText().toString();
ContentValues contentValues =new ContentValues();
contentValues.put("phonenumber",phone);
getContentResolver().update(uri,contentValues,"username=?",new String[]{name});
Toast.makeText(getApplicationContext(),"修改成功",Toast.LENGTH_LONG).show();
}
//删除
void delete(){
String name =userName.getText().toString();
if(!name.equals("")){
getContentResolver().delete(uri,"username=?",new String[]{name});
Toast.makeText(getApplicationContext(),"删除成功",Toast.LENGTH_LONG).show();
}
}
//查询
void query(){
String name =userName.getText().toString();
textView.setText("");
Uri uri =Uri.parse("content://com.example.contentprovider2demo.provider/user/"+name);
Cursor cursor =getContentResolver().query(uri,null,null,null,null);
printQueryResult(cursor);
}
void queryAll(){
textView.setText("");
Cursor cursor =getContentResolver().query(uri,null,null,null,null);
printQueryResult(cursor);
}
//根据游标返回全部数据
void printQueryResult(Cursor cursor){
if(cursor!=null){
while (cursor.moveToNext()){
String ID =cursor.getString(0);
String contactName =cursor.getString(1);
String photoNumber =cursor.getString(2);
textView.append("联系人ID:"+ID+"\n联系人姓名:"+contactName+"\n联系人电话:"+photoNumber+"\n");
}
cursor.close();
}
}
}
}
activity_main.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<EditText
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
<EditText
android:id="@+id/photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入电话" />
<Button
android:id="@+id/insertBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:id="@+id/deleteBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:id="@+id/updateBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改" />
<Button
android:id="@+id/querytBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" />
<Button
android:id="@+id/queryAllBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询全部" />
</LinearLayout>