您的位置:首页 > 移动开发 > Android开发

Android初级开发(七)——创建自己的内容提供器

2017-08-24 14:46 453 查看
本章参考自 郭霖《第一行代码》(第二版)

实现跨程序数据共享

1、先建立一个自己的DatabaseOpenHelper类

public class MyDatabaseOpenHelper extends SQLiteOpenHelper {

public static final String  CREATE_BOOK = "create table Book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private Context mContext;

public MyDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}
}


2、new一个Content Provider

将这个内容提供器命名为DatabaseProvider.authority指定为com.example.databasetest.provider,Exported属性表示是否运行外部程序访问我们的内容提供器,Enabled属性表示是否启用这个内容提供器。这两个属性都勾中。

public class DatabaseProvider extends ContentProvider {

//访问Book表中的所有数据
public static final int BOOK_DIR = 0 ;
//访问Book表中的单条数据
public static final int BOOK_ITEM = 1;
public static final String AUTHORITY = "com.example.databasetest.provider";

private static UriMatcher uriMatcher;

private MyDatabaseOpenHelper dbHelper;

static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY,"book",BOOK_DIR);
uriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM);
}
/**
* 初始化内容提供器的时候调用
* 通常在这里完成对数据库的创建和升级等操作
* @return   返回true表示内容提供器初始化成功,返回false表示失败
*/
@Override
public boolean onCreate() {
dbHelper = new MyDatabaseOpenHelper(getContext(),"BookStore.db",null,1);
return false;
}

/**
* 从内容提供器中查询数据
* @param uri       确定查询哪张表
* @param strings   确定查询那些列
* @param s          Where的约束条件
* @param strings1  为Where的占位符提供具体的值
* @param s1         确定查询结果的排序方式
* @return           返回查询结果,放在Cursor对象中
*/
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
//查询数据
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)){
case BOOK_DIR:
cursor = db.query("Book",strings,s,strings1,null,null,s1);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
cursor = db.query("Book",strings,"id=?",new String[]{bookId},null,null,s1);
break;
default:
break;
}
return cursor;
}

/**
* 根据传入的URI来返回相应的MIME类型
* @param uri
* @return
*/
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)){
case BOOK_DIR:
return "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.Book";
case BOOK_ITEM:
return "vnd.android.cursor.item/vnd.com.example.databasetest.provider.Book";
}
return null;
}

/**
* 向内容提供器中添加一条数据
* @param uri              确定要添加到的表
* @param contentValues  待添加的数据保存在values参数中
* @return                 返回一个用于表示新纪录的URI
*/
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
//添加数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)){
case BOOK_DIR:
case BOOK_ITEM:
long newBookId = db.insert("Book",null,contentValues);
uriReturn = Uri.parse("content://"+AUTHORITY+"/Book/"+newBookId);
break;
default:
break;
}
return uriReturn;
}

/**
* 从内容提供器中删除数据
* @param uri         确定要删除哪一张表的数据
* @param s            Where的约束条件
* @param strings     为Where的占位符提供具体的值
* @return             被删除的行数将作为返回值返回
*/
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
//删除数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deletedRows = 0;
switch (uriMatcher.match(uri)){
case BOOK_DIR:
deletedRows = db.delete("Book", s, strings);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
deletedRows = db.delete("Book", "id=?", new String[]{bookId});
break;
default:
break;
}
return deletedRows;
}

/**
* 更新内容提供器中已有的数据
* @param uri                确定更新哪一张表中的数据
* @param contentValues    新数据保存在values参数中
* @param s                  where的约束条件
* @param strings           为where的占位符提供具体的值
* @return                   受影响的行数作为返回值返回
*/
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
//更新数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateRows = 0;
switch (uriMatcher.match(uri)) {
case BOOK_DIR:
updateRows = db.update("Book", contentValues, s, strings);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
updateRows = db.update("Book", contentValues, "id=?", new String[]{bookId});
break;
default:
break;
}

return updateRows;
}
}


3、布局文件

<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="添加数据"
android:textSize="25dp"/>
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="查询数据"
android:textSize="25dp"/>
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="更新数据"
android:textSize="25dp"/>
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="删除数据"
android:textSize="25dp"/>

</LinearLayout>


4、MainActivity中

public class MainActivity extends AppCompatActivity {

private String newId;
private Button addData,queryData,updateData,deleteData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//添加数据
Uri uri = Uri.parse("content://com.example.databasetest.provider/Book");
ContentValues values = new ContentValues();
values.put("name","A Clash of Kings");
values.put("author","George Martin");
values.put("pages",1040);
values.put("price",22.85);
Uri newUri = getContentResolver().insert(uri,values);
newId = newUri.getPathSegments().get(1);
}
});

queryData = (Button) findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//查询数据
Uri uri = Uri.parse("content://com.example.databasetest.provider/Book");
Cursor cursor = getContentResolver().query(uri,null,null,null,null);
if(cursor != null){
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int page = cursor.getInt(cursor.getColumnIndex("page"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("MainActicity","book name is"+name);
Log.d("MainActicity","book author is"+author);
Log.d("MainActicity","book page is"+page);
Log.d("MainActicity","book price is"+price);
}
cursor.close();
}
}
});

updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//更新数据
Uri uri = Uri.parse("content://com.example.databasetest.provider/Book/"+newId);
ContentValues values = new ContentValues();
values.put("name","A Storm of Swords");
values.put("pages",1216);
values.put("price",24.05);
getContentResolver().update(uri,values,null,null);
}
});

deleteData = (Button) findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//删除数据
Uri uri = Uri.parse("content://com.example.databasetest.provider/Book"+newId);
getContentResolver().delete(uri,null,null);
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内容提供器