Android Studio Content Provider 实现数据共享示例:应用程序A与B交互

本教程将引导您创建一个 Android 应用示例,展示如何使用 Content Provider 实现两个应用程序之间的数据共享。示例中,我们将创建两个应用程序 A 和 B,其中应用程序 A 包含一个内置的 SQLite 数据库,数据库中包含一个图书表,包含书名、作者、页数和价格等字段。应用程序 A 将创建 Content Provider 来实现对数据库图书表数据的共享。应用程序 B 将使用 ListView 或 RecycleView 来展示数据,并通过应用程序 A 的 Content Provider 接口来对图书数据进行增删改查操作,并实时显示操作结果。

一、实验概述

实验需要创建两个应用程序 A 和 B,其中应用 A 中包含了 Android 自带的 SQLite 数据库,数据库中包含了一个图书表,其中拥有 (书名,作者,页数,价格) 等字段。我们需要在应用 A 中创建内容提供器,实现对其拥有的数据库图书表的数据共享。在应用 B 中创建 ListView 或者 RecycleView,通过应用 A 的内容提供器接口,实现对应用 A 数据库图书表中的数据进行增删改查操作,并将操作后的结果实时显示。

二、实验要求

  1. 应用 A 及其界面:包含相应的数据库创建,增删改查等功能按钮,实现对应用 A 数据库图书表数据的相应操作,操作后结果以 Log 日志的方式输出。
  2. 应用 B 及其界面:包含增删改查等功能按钮,实现对应用 A 数据库图书表数据的相应操作,操作后结果以 ListView 或 RecycleView 方式实时呈现在应用界面上。

三、代码示例

应用 A 代码

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnCreateDB;
    private Button btnInsertData;
    private Button btnUpdateData;
    private Button btnDeleteData;
    private Button btnQueryData;

    private SQLiteDatabase db;

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

        btnCreateDB = findViewById(R.id.btn_create_db);
        btnInsertData = findViewById(R.id.btn_insert_data);
        btnUpdateData = findViewById(R.id.btn_update_data);
        btnDeleteData = findViewById(R.id.btn_delete_data);
        btnQueryData = findViewById(R.id.btn_query_data);

        btnCreateDB.setOnClickListener(this);
        btnInsertData.setOnClickListener(this);
        btnUpdateData.setOnClickListener(this);
        btnDeleteData.setOnClickListener(this);
        btnQueryData.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create_db:
                createDB();
                break;
            case R.id.btn_insert_data:
                insertData();
                break;
            case R.id.btn_update_data:
                updateData();
                break;
            case R.id.btn_delete_data:
                deleteData();
                break;
            case R.id.btn_query_data:
                queryData();
                break;
        }
    }

    private void createDB() {
        db = openOrCreateDatabase('book.db', MODE_PRIVATE, null);
        db.execSQL('CREATE TABLE IF NOT EXISTS book (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, author TEXT, pages INTEGER, price REAL)');
    }

    private void insertData() {
        ContentValues values = new ContentValues();
        values.put('name', 'Android Programming');
        values.put('author', 'John Doe');
        values.put('pages', 500);
        values.put('price', 29.99);
        db.insert('book', null, values);
        Log.d('MainActivity', 'Insert data success');
    }

    private void updateData() {
        ContentValues values = new ContentValues();
        values.put('price', 39.99);
        db.update('book', values, 'name = ?', new String[]{'Android Programming'});
        Log.d('MainActivity', 'Update data success');
    }

    private void deleteData() {
        db.delete('book', 'name = ?', new String[]{'Android Programming'});
        Log.d('MainActivity', 'Delete data success');
    }

    private void queryData() {
        Cursor cursor = db.query('book', null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                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 + ', ' + author + ', ' + pages + ', ' + price);
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
}

activity_main.xml:

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    xmlns:tools='http://schemas.android.com/tools'
    android:layout_width='match_parent'
    android:layout_height='match_parent'
    android:orientation='vertical'
    android:padding='16dp'
    tools:context='.MainActivity'>

    <Button
        android:id='@+id/btn_create_db'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Create Database' />

    <Button
        android:id='@+id/btn_insert_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Insert Data' />

    <Button
        android:id='@+id/btn_update_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Update Data' />

    <Button
        android:id='@+id/btn_delete_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Delete Data' />

    <Button
        android:id='@+id/btn_query_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Query Data' />

</LinearLayout>

应用 B 代码

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView listView;
    private Button btnInsertData;
    private Button btnUpdateData;
    private Button btnDeleteData;
    private Button btnQueryData;

    private MyAdapter adapter;
    private List<Book> bookList = new ArrayList<>();

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

        listView = findViewById(R.id.list_view);
        btnInsertData = findViewById(R.id.btn_insert_data);
        btnUpdateData = findViewById(R.id.btn_update_data);
        btnDeleteData = findViewById(R.id.btn_delete_data);
        btnQueryData = findViewById(R.id.btn_query_data);

        btnInsertData.setOnClickListener(this);
        btnUpdateData.setOnClickListener(this);
        btnDeleteData.setOnClickListener(this);
        btnQueryData.setOnClickListener(this);

        adapter = new MyAdapter(this, R.layout.list_item, bookList);
        listView.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_insert_data:
                insertData();
                break;
            case R.id.btn_update_data:
                updateData();
                break;
            case R.id.btn_delete_data:
                deleteData();
                break;
            case R.id.btn_query_data:
                queryData();
                break;
        }
    }

    private void insertData() {
        // 使用 ContentResolver 访问应用 A 中的 Content Provider
        Uri uri = Uri.parse('content://com.example.appa.provider/book');
        ContentValues values = new ContentValues();
        values.put('name', 'Android Programming');
        values.put('author', 'John Doe');
        values.put('pages', 500);
        values.put('price', 29.99);
        getContentResolver().insert(uri, values);
    }

    private void updateData() {
        Uri uri = Uri.parse('content://com.example.appa.provider/book');
        ContentValues values = new ContentValues();
        values.put('price', 39.99);
        getContentResolver().update(uri, values, 'name = ?', new String[]{'Android Programming'});
    }

    private void deleteData() {
        Uri uri = Uri.parse('content://com.example.appa.provider/book');
        getContentResolver().delete(uri, 'name = ?', new String[]{'Android Programming'});
    }

    private void queryData() {
        Uri uri = Uri.parse('content://com.example.appa.provider/book');
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            bookList.clear();
            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'));
                Book book = new Book(name, author, pages, price);
                bookList.add(book);
            }
            cursor.close();
            adapter.notifyDataSetChanged();
        }
    }
}

MyAdapter.java:

public class MyAdapter extends ArrayAdapter<Book> {

    private int resourceId;

    public MyAdapter(Context context, int resource, List<Book> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Book book = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.tvName = view.findViewById(R.id.tv_name);
            viewHolder.tvAuthor = view.findViewById(R.id.tv_author);
            viewHolder.tvPages = view.findViewById(R.id.tv_pages);
            viewHolder.tvPrice = view.findViewById(R.id.tv_price);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.tvName.setText(book.getName());
        viewHolder.tvAuthor.setText(book.getAuthor());
        viewHolder.tvPages.setText(String.valueOf(book.getPages()));
        viewHolder.tvPrice.setText(String.valueOf(book.getPrice()));
        return view;
    }

    private class ViewHolder {
        TextView tvName;
        TextView tvAuthor;
        TextView tvPages;
        TextView tvPrice;
    }
}

Book.java:

public class Book {

    private String name;
    private String author;
    private int pages;
    private double price;

    public Book(String name, String author, int pages, double price) {
        this.name = name;
        this.author = author;
        this.pages = pages;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public int getPages() {
        return pages;
    }

    public double getPrice() {
        return price;
    }
}

activity_main.xml:

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    xmlns:tools='http://schemas.android.com/tools'
    android:layout_width='match_parent'
    android:layout_height='match_parent'
    android:orientation='vertical'
    android:padding='16dp'
    tools:context='.MainActivity'>

    <Button
        android:id='@+id/btn_insert_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Insert Data' />

    <Button
        android:id='@+id/btn_update_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Update Data' />

    <Button
        android:id='@+id/btn_delete_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Delete Data' />

    <Button
        android:id='@+id/btn_query_data'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:text='Query Data' />

    <ListView
        android:id='@+id/list_view'
        android:layout_width='match_parent'
        android:layout_height='wrap_content' />

</LinearLayout>

list_item.xml:

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    android:layout_width='match_parent'
    android:layout_height='wrap_content'
    android:orientation='vertical'>

    <TextView
        android:id='@+id/tv_name'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:textSize='18sp'
        android:textStyle='bold' />

    <TextView
        android:id='@+id/tv_author'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:textSize='16sp' />

    <TextView
        android:id='@+id/tv_pages'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:textSize='16sp' />

    <TextView
        android:id='@+id/tv_price'
        android:layout_width='match_parent'
        android:layout_height='wrap_content'
        android:textSize='16sp' />

</LinearLayout>

四、总结

本教程提供了一个完整的 Android 应用示例,演示了如何使用 Content Provider 实现应用程序之间的数据共享,并提供了详细的代码和注释。通过本教程,您可以更好地理解 Content Provider 的作用,并将其应用于自己的 Android 开发项目中。

注意:

  • 为了完整运行示例,您需要创建两个应用程序 A 和 B,并将上述代码分别添加到对应应用程序的代码中。
  • 应用程序 A 需要实现 Content Provider,并将相关代码添加到 AndroidManifest.xml 文件中。
  • 应用程序 B 需要使用 Content Resolver 来访问应用程序 A 的 Content Provider,并在 AndroidManifest.xml 文件中添加相关权限。

希望本教程能够帮助您更好地理解并使用 Android Content Provider。

Android Studio Content Provider 实现数据共享示例:应用程序A与B交互

原文地址: https://www.cveoy.top/t/topic/fhry 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录