Android Studio Content Provider 实现数据共享示例:应用程序A与B交互
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 数据库图书表中的数据进行增删改查操作,并将操作后的结果实时显示。
二、实验要求
- 应用 A 及其界面:包含相应的数据库创建,增删改查等功能按钮,实现对应用 A 数据库图书表数据的相应操作,操作后结果以 Log 日志的方式输出。
- 应用 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。
原文地址: https://www.cveoy.top/t/topic/fhry 著作权归作者所有。请勿转载和采集!