Android Studio 图书管理系统:ContentProvider实现跨应用数据共享
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_TYPE和CONTENT_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创建简单的图书管理系统,并通过内容提供器实现跨应用程序的数据共享。你可以根据自己的需要,扩展应用的功能,例如添加更多数据表、实现更复杂的数据查询等
原文地址: http://www.cveoy.top/t/topic/faON 著作权归作者所有。请勿转载和采集!