Android Studio 图书管理系统:ContentProvider实现跨应用数据共享

本教程将带你使用Android Studio创建两个应用程序(A和B),应用A包含一个SQLite数据库和内容提供器,用于管理图书信息;应用B则通过内容提供器访问和操作应用A中的数据。

一、功能概述

  • 应用A: - 创建SQLite数据库,包含图书表(书名、作者、页数、价格)。 - 创建内容提供器,实现对图书表数据的共享。 - 提供界面和按钮,实现对数据库的增删改查操作,并将操作结果输出到Logcat。- 应用B: - 通过应用A的内容提供器,访问和操作图书表数据。 - 提供界面和按钮,实现对数据库的增删改查操作,并将操作结果实时显示在ListView或RecycleView中。

二、主要知识点

  • 活动的生命周期和管理- 数据库的创建、增删改查操作- 内容提供器的创建和注册- 跨应用程序数据访问- ListView或RecycleView的使用- 运行时权限申请

三、应用A代码详解

1. 创建数据库和图书表javapublic class BookDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = 'book.db'; private static final int DB_VERSION = 1;

public BookDatabaseHelper(Context context) {        super(context, DB_NAME, null, DB_VERSION);    }

@Override    public void onCreate(SQLiteDatabase db) {        // 创建图书表        db.execSQL('CREATE TABLE book (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, pages INTEGER, price REAL)');    }

@Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        // 数据库升级逻辑(暂时不需要)    }}

这段代码定义了一个数据库帮助类BookDatabaseHelper,用于创建和管理数据库。onCreate()方法会在数据库第一次创建时调用,这里创建了一个名为book的表,包含图书的基本信息。

2. 创建内容提供器javapublic class BookProvider extends ContentProvider { private static final String AUTHORITY = 'com.example.bookprovider'; // 内容提供器的authority private static final UriMatcher uriMatcher; // Uri匹配器 private static final int BOOK_DIR = 0; // 匹配图书列表的uri private static final int BOOK_ITEM = 1; // 匹配单个图书的uri

private static final String CONTENT_TYPE = 'vnd.android.cursor.dir/vnd.com.example.book.provider.book'; // 图书列表的MIME类型    private static final String CONTENT_ITEM_TYPE = 'vnd.android.cursor.item/vnd.com.example.book.provider.book'; // 单个图书的MIME类型

private BookDatabaseHelper dbHelper; // 数据库帮助类

static {        // 初始化Uri匹配器        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        uriMatcher.addURI(AUTHORITY, 'book', BOOK_DIR);        uriMatcher.addURI(AUTHORITY, 'book/#', BOOK_ITEM);     }

@Override    public boolean onCreate() {        // 创建数据库帮助类实例        dbHelper = new BookDatabaseHelper(getContext());        return true;    }

@Nullable    @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: // 查询单个图书                String bookId = uri.getPathSegments().get(1); // 获取图书ID                cursor = db.query('book', projection, '_id = ?', new String[]{bookId}, null, null, sortOrder);                break;            default:                break;        }        return cursor;    }

// ... 其他方法(getType, insert, delete, update)与query方法类似,根据Uri进行相应的操作

}

这段代码定义了应用A的内容提供器BookProvider,它负责处理来自其他应用的数据请求。

  • AUTHORITY:内容提供器的标识,用于在系统中唯一标识该内容提供器。- UriMatcher:用于匹配不同的Uri,根据匹配结果执行不同的数据操作。- CONTENT_TYPECONTENT_ITEM_TYPE:定义了返回数据的MIME类型,用于标识数据类型。- query()insert()delete()update():分别对应数据的查询、插入、删除和更新操作,根据传入的Uri和参数进行相应的数据库操作。

3. 在AndroidManifest.xml中注册内容提供器xml<provider android:name='.BookProvider' // 内容提供器的类名 android:authorities='com.example.bookprovider' // 内容提供器的authority android:exported='true' />

这段代码将BookProvider注册到Android系统中,并将其暴露给其他应用程序(android:exported='true')。

4. 应用A界面和操作逻辑

在应用A的布局文件中添加按钮,并为每个按钮设置点击事件监听器。在点击事件处理方法中,调用ContentResolver进行相应的数据库操作。javapublic class MainActivity extends AppCompatActivity implements View.OnClickListener { // ... 按钮变量声明 ...

@Override    protected void onCreate(Bundle savedInstanceState) {        // ... 初始化按钮 ...    }

@Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.add_button:                // 插入数据                insertBook();                break;            case R.id.delete_button:                // 删除数据                deleteBook();                break;            case R.id.update_button:                // 更新数据                updateBook();                break;            case R.id.query_button:                // 查询数据                queryBooks();                break;            default:                break;        }    }

private void insertBook() {        // ... 通过ContentResolver插入数据 ...    }

private void deleteBook() {        // ... 通过ContentResolver删除数据 ...    }

private void updateBook() {        // ... 通过ContentResolver更新数据 ...    }

private void queryBooks() {        // ... 通过ContentResolver查询数据,并将结果输出到Logcat ...    }}

四、应用B代码详解

应用B通过ContentResolver访问应用A的内容提供器,并使用相同的Uri进行数据操作。

1. 应用B界面和操作逻辑

在应用B的布局文件中添加ListView或RecycleView,并创建相应的适配器。在点击事件处理方法中,调用ContentResolver进行数据库操作,并将结果更新到ListView或RecycleView中。javapublic class MainActivity extends AppCompatActivity implements View.OnClickListener { // ... 按钮和ListView/RecycleView变量声明 ...

@Override    protected void onCreate(Bundle savedInstanceState) {        // ... 初始化按钮和ListView/RecycleView ...    }

@Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.add_button:                // 插入数据                insertBook();                break;            case R.id.delete_button:                // 删除数据                deleteBook();                break;            case R.id.update_button:                // 更新数据                updateBook();                break;            case R.id.query_button:                // 查询数据                queryBooks();                break;            default:                break;        }    }

private void insertBook() {        // ... 通过ContentResolver插入数据 ...    }

private void deleteBook() {        // ... 通过ContentResolver删除数据 ...    }

private void updateBook() {        // ... 通过ContentResolver更新数据 ...    }

private void queryBooks() {        // ... 通过ContentResolver查询数据,并将结果更新到ListView/RecycleView中 ...    }}

五、总结

本教程介绍了如何使用Android Studio创建简单的图书管理系统,并通过内容提供器实现跨应用程序的数据共享。你可以根据自己的需要,扩展应用的功能,例如添加更多数据表、实现更复杂的数据查询等

Android Studio 图书管理系统:ContentProvider实现跨应用数据共享

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

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