直接上代码了,说那么多理论 都没有代码实在
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;
public class BankBackDoor extends ContentProvider {
private int i=0;
//增删改查 匹配规则
public static final int QUERY_SUCCESS = 0;
public static final int UPDATE_SUCCESS = 1;
public static final int DELETE_SUCCESS = 2;
public static final int INSERT_SUCCESS = 3;
// UriMatcher是一个工具类,用于帮助内容提供者匹配URIs
private static final UriMatcher MURI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
// 添加路径匹配规则
static {
// 添加一个path(匹配规则),如果匹配成功会返回code值。
// authority:主机名(我们可以自己定义,随意写,当使用内容解析者时会使用到)
// path:路径,一般是操作名称
// code:响应码
MURI_MATCHER.addURI("你自定义的标识", "insert", INSERT_SUCCESS);
MURI_MATCHER.addURI("你自定义的标识", "delete", DELETE_SUCCESS);
MURI_MATCHER.addURI("你自定义的标识r", "update", UPDATE_SUCCESS);
MURI_MATCHER.addURI("你自定义的标识r", "query", QUERY_SUCCESS);
}
private SQLiteDatabase db;
private static final String ACCOUNT = "account"; //你的数据库表名
/**
继承之后,发现有四个6个方法,给我们重写,
其中query,insert,update,delete就是对应数据库的
CRUD的方法,同时这个四个方法也对应这内容解析者的query,insert,update,delete,
内容解析者,通过调用自己的CRUD,就可以操作内容提供者的CRUD,
内容通过自己的CRUD又可以去操作自己数据库的CRUD,
所以说:
有一个核心: 到底修改什么数据,执行什么数据插入, 查询,删除,都不能由我们做主,因为我们只是一个跑腿。 我们不生产数据,我们只是数据的搬运工。
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int MATCH_CODE = MURI_MATCHER.match(uri);
// 判断路径是否匹配成功
if (MATCH_CODE == QUERY_SUCCESS) {
// 调用SQLiteDatabase中的方法查询私有的数据库
return db.query(ACCOUNT, projection, selection, selectionArgs, null, null, null);
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int MATCH_CODE = MURI_MATCHER.match(uri);
// 判断路径是否匹配成功
if (MATCH_CODE == INSERT_SUCCESS) {
long insertResult = db.insert(ACCOUNT, null, values);
// 此处的Uri可以随意写
return Uri.parse("measurement.android.com.mya.BankBackDoor:" + insertResult);
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int MATCH_CODE = MURI_MATCHER.match(uri);
// 判断路径是否匹配成功
if (MATCH_CODE == DELETE_SUCCESS) {
return db.delete(ACCOUNT, selection, selectionArgs);
}
return i;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int MATCH_CODE = MURI_MATCHER.match(uri);
// 判断路径是否匹配成功
if (MATCH_CODE == UPDATE_SUCCESS) {
return db.update(ACCOUNT, values, selection, selectionArgs);
}
return i;
}
@Override
public boolean onCreate() {
MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getContext());
db = mySQLiteOpenHelper.getWritableDatabase();
return true;
}
@Override
public String getType(Uri uri) {
return null;
}
}
一个内容提供者就封装好了
然后要在清单文件注册 四大组件套路
<provider
android:name=".BankBackDoor"
android:exported="true" //这个属性 相当于一个权限 如果不设置其他应用访问不到
android:authorities="你自定义的 必须和内容提供者里面的那个一样"
><!--设置口令-->
</provider>
接下来我们就要写数据库了(原先一直以为是文件形式)
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.text.MessageFormat;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private SQLiteDatabase db;
public static final String ID="_id";
public static final String USERCODE="usercode";
public static final String USERFAMALY="userfamaly";
public static final String SEX="sex";
public static final String TABLE_NAME="account";
public MySQLiteOpenHelper(Context context)
{
super(context, "account.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
this.db=db;
// 创建数据库,并初始化两条语句
// db.execSQL("create table account(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
db.execSQL("CREATE TABLE "+TABLE_NAME+"("+
ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
+USERCODE+" TEXT NOT NULL,"
+USERFAMALY+" TEXT NOT NULL,"
+SEX+" TEXT"+")");
ContentValues cv =new ContentValues();
cv.put("usercode","usercode");
cv.put("userfamaly","userfamaly");
// cv.put("age",1);
db.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
public static final String Sql_StandardFormula_UpdateBusinessType = "update account set name=? where _id=?";
public void UpDate(SQLiteDatabase dbs,String value)
{
String sqlstr=MessageFormat.format(Sql_StandardFormula_UpdateBusinessType, value,0);
dbs.execSQL(sqlstr);
dbs.close(); // 关闭数据库连接
}
}
数据库完成 这样一个完整的内容提供者就完成了 命名为A应用(不要忘了查几条数据)
接下来我们搞B应用(二句话)
只需要在你要应用中调用我这工具类你就可以读取到A应用数据库并且可以 完成 增删改查的工作
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
public class UserCodeUtlis {
// 固定写法:content://主机地址/路径
private static Uri uri = Uri.parse("content://你自定义的/query");
public static String getUserCode(Context context){
// 获取内容解析者
ContentResolver resolver = context.getContentResolver();
// 调用内容解析者的查询方法
Cursor cursor = resolver.query(uri, null, null, null, null);
String usercode="";
String userfamaly="";
// 拿出游标中的数据
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
usercode = cursor.getString(1);
userfamaly = cursor.getString(2);
Log.e("WZX","查询数据---数据内容(usercode:" + usercode + ",userfamaly:" + userfamaly + ")");
}
// 关闭游标
cursor.close();
}
return usercode;
}
public static String getUserFamaly(Context context){
// 获取内容解析者
ContentResolver resolver = context.getContentResolver();
// 调用内容解析者的查询方法
Cursor cursor = resolver.query(uri, null, null, null, null);
String usercode="";
String userfamaly="";
// 拿出游标中的数据
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
usercode = cursor.getString(1);
userfamaly = cursor.getString(2);
Log.e("WZX","查询数据---数据内容(usercode:" + usercode + ",userfamaly:" + userfamaly + ")");
}
// 关闭游标
cursor.close();
}
return userfamaly;
}
}
完成