内容提供器——跨程序共享数据

在DatabaseTest项目的基础上继续开发

DatabaseTest项目见持久化技术——SQLite数据库存储

1. 创建内容提供器

右击com.example.databasetest包–>New–>Other–>Content Provider,将内容提供器命名为DatabaseProvider,authority指定为com.example.databasetest.provider,将Exported属性和Enable属性都选中。

package com.example.databasetest;

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 DatabaseProvider extends ContentProvider {

    public static final int BOOK_DIR = 0;   //Book表中的所有数据

    public static final int BOOK_ITEM = 1;   //Book表中的单条数据

    public static final int CATEGORY_DIR = 2;   //Category表中的所有数据

    public static final int CATEGORY_ITEM = 3;  //Category表中的单条数据

    public static final String AUTHORITY = "com.example.databasetest.provider";   

    private static UriMatcher uriMatcher;

    private MyDatabaseHelper dbHelper;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);
        uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);
        uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);
        uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);
    }


//创建内容提供器
    @Override
    public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);
        return true;   //true表示创建成果
    }


  // 查询数据
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = null;
        //根据传入的Uri参数来判断访问哪张表
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case BOOK_ITEM:
               //getPathSegments()将内容URI权限之后的部分以"/“符号进行分割并存入字符串列表,0位置存放  路径,第1个位置存放id。
                String bookId = uri.getPathSegments().get(1);
                cursor = db.query("Book", projection, "id = ?", new String[] { bookId }, null, null, sortOrder);
                break;
            case CATEGORY_DIR:
                cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                cursor = db.query("Category", projection, "id = ?", new String[] { categoryId }, null, null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

  // 添加数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
            case BOOK_ITEM:
                long newBookId = db.insert("Book", null, values);
                //调用Uri.parse()方法将一个内容URI解析为Uri对象,该对象已新增数据的id结尾
                uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
                break;
            case CATEGORY_DIR:
            case CATEGORY_ITEM:
                long newCategoryId = db.insert("Category", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

  // 更新数据
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //受影响的行数作为返回值
        int updatedRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                updatedRows = db.update("Book", values, selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                updatedRows = db.update("Book", values, "id = ?", new String[] { bookId });
                break;
            case CATEGORY_DIR:
                updatedRows = db.update("Category", values, selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                updatedRows = db.update("Category", values, "id = ?", new String[] { categoryId });
                break;
            default:
                break;
        }
        return updatedRows;
    }

    // 删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //被删除的行数作为返回值
        int deletedRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                deletedRows = db.delete("Book", selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Book", "id = ?", new String[] { bookId });
                break;
            case CATEGORY_DIR:
                deletedRows = db.delete("Category", selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Category", "id = ?", new String[] { categoryId });
                break;
            default:
                break;
        }
        return deletedRows;
    }

    @Override
    public String getType(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";
            case CATEGORY_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.category";
            case CATEGORY_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.category";
        }
        return null;
    }

}

2.在AndroidManifest.xml中注册内容提供器

注册这一步自动完成

 <provider
            android:name=".DatabaseProvider"
            android:authorities="com.example.databasetest.provider"
            android:enabled="true"
            android:exported="true"></provider>

3.运行该项目,将该程序重新装在模拟器上

创建新项目ProviderTest

通过该程序去访问DatabaseTest中的数据

1. 编写布局文件

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

    <Button
        android:id="@+id/add_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add database"/>
    <Button
        android:id="@+id/updata_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Updata database"/>
    <Button
        android:id="@+id/delet_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delet_database"/>
    <Button
        android:id="@+id/query_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Query database"/>

</LinearLayout> 

2. 访问DatabaseTest中的数据

修改MainActivity中的代码

package com.example.providertest;

 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private String newId;

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

         // 添加数据
        Button addData = (Button) findViewById(R.id.add_database);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //将内容URI解析为Uri对象
                Uri uri = Uri.parse("content://com.example.databasetest.provider/book");
                //将要添加的数据存放在ContentValues对象中
                ContentValues values = new ContentValues();
                values.put("name", "A Clash of Kings");
                values.put("author", "George Martin");
                values.put("pages", 1040);
                values.put("price", 55.55);
                //调用insert方法执行添加操作
                Uri newUri = getContentResolver().insert(uri, values);
                //取出新增数据的id
                newId = newUri.getPathSegments().get(1);
            }
        });


        // 查询数据
        Button queryData = (Button) findViewById(R.id.query_database);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
           
                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 pages = cursor.getInt(cursor.getColumnIndex ("pages"));
                        double price = cursor.getDouble(cursor. getColumnIndex("price"));
                        Log.d("MainActivity", "book name is " + name);
                        Log.d("MainActivity", "book author is " + author);
                        Log.d("MainActivity", "book pages is " + pages);
                        Log.d("MainActivity", "book price is " + price);
                    }
                    cursor.close();
                }
            }
        });


        // 更新数据
        Button updateData = (Button) findViewById(R.id.updata_database);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //使用到了刚刚保存的新数据的id
                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);
            }
        });

        
        //删除数据
        Button deleteData = (Button) findViewById(R.id.delet_database);
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("content://com.example.databasetest.provider/book/" + newId);
                getContentResolver().delete(uri, null, null);
            }
        });
    }

}

3. 运行ProviderTest

在这里插入图片描述
点击ADD DATABASE按钮添加数据,再点击QUERY DATABASE查询数据,打印日志如图
在这里插入图片描述
点击UPDATE DATABASE按钮更新数据,再点击查询按钮,打印日志如图
在这里插入图片描述

点击DELET DATABASE按钮删除数据,再点击查询按钮,什么也不打印,因为数据已经被全部删掉啦!!!

猜你喜欢

转载自blog.csdn.net/weixin_42937036/article/details/92380986
今日推荐