1、Content Provider 是什么
- 应用程序间共享数据的一种方式
- 为存储和获取数据提供了统一的接口
- Android为常见的一些数据提供了默认的ContentProvider
- Uri介绍:要操作的数据表示方式
2、极简形式
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class TestContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
3、实际实现一个
- Database
- Uri
- UriMatcher
- ContentProvider
- query/insert/update/delete
- AndroidManifest.xml
1、先在DatabaseHelper.java中再创建一个表:
db.execSQL("create table " + BOOK_TABLE_NAME + "(" + BOOK_NAME + " varchar(20) not null, " + BOOK_PRICE + " varchar(10) not null);");
2、创建一个provider文件夹,新建URIList.java:
package com.xx.aboutactivity.provider;
import com.xx.aboutactivity.database.DatabaseHelper;
public class URIList {
public static final String CONTENT = "content://";
public static final String AUTHORITY = "com.jsc4.aboutactivity";//包名
public static final String USER_URI = CONTENT + AUTHORITY + "/" + DatabaseHelper.USER_TABLE_NAME;
public static final String BOOK_URI = CONTENT + AUTHORITY + "/" + DatabaseHelper.BOOK_TABLE_NAME;
}
3、创建TestContentProvider.java:
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.jsc4.aboutactivity.database.DatabaseHelper;
public class TestContentProvider extends ContentProvider {
private static UriMatcher sUriMatcher;
public static final int URI_MATCH_USER = 1;
public static final int URI_MATCH_BOOK = 2;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// content://com.jsc4.aboutactivity/user
// content://com.jsc4.aboutactivity/book
sUriMatcher.addURI(URIList.AUTHORITY, DatabaseHelper.USER_TABLE_NAME, URI_MATCH_USER);
sUriMatcher.addURI(URIList.AUTHORITY, DatabaseHelper.USER_TABLE_NAME, URI_MATCH_BOOK);
}
DatabaseHelper mDatabaseHelper;
@Override
public boolean onCreate() {
mDatabaseHelper = new DatabaseHelper(getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
// 知道用户在调用哪张表
String tableName = getTabName(uri);
if(TextUtils.isEmpty(tableName)){
return null;
}
Cursor cursor = mDatabaseHelper.getReadableDatabase()
.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
String tableName = getTabName(uri);
if(TextUtils.isEmpty(tableName)){
return null;
}
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
private String getTabName(Uri uri){
int type = sUriMatcher.match(uri);
String tableName = null;
switch (type){
case URI_MATCH_USER:
tableName = DatabaseHelper.USER_TABLE_NAME;
break;
case URI_MATCH_BOOK:
tableName = DatabaseHelper.BOOK_TABLE_NAME;
break;
}
return tableName;
}
}
4、在DatabaseButtonActivity.java中调用:
ContentResolver contentResolver = getContentResolver();
// 这里拿着uri去找
contentResolver.query(Uri.parse(URIList.USER_URI), null, null, null, null);//content://com.jsc4.aboutactivity/user
全文如下:
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.jsc4.aboutactivity.database.DatabaseHelper;
import com.jsc4.aboutactivity.provider.URIList;
public class DatabaseButtonActivity extends AppCompatActivity {
SQLiteDatabase mSqLiteDatabase;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);
DatabaseHelper databaseHelper = new DatabaseHelper(this);
mSqLiteDatabase = databaseHelper.getWritableDatabase();
// Insert
findViewById(R.id.database_add_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// IO操作,建议后台操作
// 拼装成contentValues
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.USERNAME, "miamia");
contentValues.put(DatabaseHelper.AGE, "13");
// 判断插入是否成功
long row = mSqLiteDatabase.insert(DatabaseHelper.USER_TABLE_NAME, null, contentValues);
Log.i("djtest", "onClick: row="+row);
if(row != -1) {
Toast.makeText(DatabaseButtonActivity.this, "插入成功!", Toast.LENGTH_SHORT).show();
}
// query
Cursor cursor = mSqLiteDatabase.query(DatabaseHelper.USER_TABLE_NAME, null, null, null, null, null, null);
if(cursor.moveToFirst()) {
int count = cursor.getCount();
for (int i = 0; i < count; i++) {
String userName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.USERNAME));
String age = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.AGE));
Log.i("djtest",i + " : " + userName + " | " + age + ".");
}
}
}
});
findViewById(R.id.database_delete_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// delete
String whereClauseString = "username=?";
String[] whereArgs = {
"miamia"};
mSqLiteDatabase.delete(DatabaseHelper.USER_TABLE_NAME, whereClauseString, whereArgs);
}
});
findViewById(R.id.database_update_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// update
// 当字段username=miamia时,将age更新为18
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.AGE, "18");
String whereClauseString = "username=?";
String[] whereArgs = {
"miamia"};
mSqLiteDatabase.update(DatabaseHelper.USER_TABLE_NAME, contentValues, whereClauseString, whereArgs);
}
});
findViewById(R.id.database_transactions_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSqLiteDatabase.beginTransaction();//开始事务,此时数据库会被锁定
try {
// 做你的操作
for (int i = 0; i < 1000; i++) {
mSqLiteDatabase.execSQL("insert into user(username, age) values ('miamia', '5岁')");
}
mSqLiteDatabase.setTransactionSuccessful();//设置事务已经成功,否则自动回滚不提交
} catch (Exception e) {
e.printStackTrace();
} finally {
mSqLiteDatabase.endTransaction();//提交并关闭事务
}
ContentResolver contentResolver = getContentResolver();
// 这里拿着uri去找
contentResolver.query(Uri.parse(URIList.USER_URI), null, null, null, null);//content://com.jsc4.aboutactivity/user
}
});
}
}
5、在AndroidManifest.xml注册:
<application>
<provider
android:authorities="com.jsc4.aboutactivity"
android:name=".provider.TestContentProvider"/>
</application>