0
点赞
收藏
分享

微信扫一扫

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)



文章目录

  • ​​SQLite、ListView、Intent数据传输综合应用​​
  • ​​一、问题描述​​
  • ​​二、需求​​
  • ​​三、分析​​
  • ​​四、效果展示​​
  • ​​五、代码解析​​
  • ​​第一步:查询数据库信息​​
  • ​​第二步:将数据适配到组件中​​
  • ​​第三步:点击item跳转Activity2,传输数据​​
  • ​​第四步:Activity2获取Activity1传送的数据,进行页面显示​​
  • ​​六、完整代码​​
  • ​​两个布局​​
  • ​​数据库表实体类​​
  • ​​Activity1 查询数据展示 ListView​​
  • ​​Activity2 展示详情​​
  • ​​补充​​

SQLite、ListView、Intent数据传输综合应用

一、问题描述

我们已经创建了数据库名称为“Books.db”,其中包含一张表:books 表,其中存放书籍的基本信息。表结构如表-1 所示:

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_数据


自定义的 MyDataBaseHelper.java 文件在【资源类】文件夹中,请大家自行查看。

package com.example.learning.SQLite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDataBaseHelper extends SQLiteOpenHelper {
// 声明数据库名称
private static final String DATABASE_NAME = "Books.db";
// 声明版本号
private static final int DATABASE_VERSION = 1;
// 建表语句
private static final String creat_book = "CREATE TABLE books ( " +
"_id INTEGER PRIMARY KEY," +
"book_name TEXT, " +
"book_isbn TEXT, " +
"book_author TEXT, " +
"book_press TEXT, " +
"book_price NUMBERIC " +
");";
// 三条数据插入语句
private static final String insert_book1 = "insert into books(book_name,book_isbn,book_author,book_press,book_price)" +
" values('Java程序设计','0001-9999-0001','张力','电子工业出版社',36.0)";
private static final String insert_book2 = "insert into books(book_name,book_isbn,book_author,book_press,book_price)" +
" values('Android权威指南','0001-8888-0001','王琦','人民出版社',59.0)";
private static final String insert_book3 = "insert into books(book_name,book_isbn,book_author,book_press,book_price)" +
" values('SQLite数据库应用指南','0001-6666-0001','李帅','希望出版社',28.0)";

// 构造方法
public MyDataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// 数据库第一次创建的时候就会调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(creat_book);
db.execSQL(insert_book1);
db.execSQL(insert_book2);
db.execSQL(insert_book3);
}

// 当有版本更新的时候才会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table books");
onCreate(db);
}
}

​​返回顶部​​

二、需求

需要创建一个书籍名称列表界面,然后用户点击选择书籍名,系统打开书籍详细信息界面的应用,要求在一个 Activity 中列表显示书籍名称信息,然后在另一个 Activity 中查询并展示某一个书籍的详细信息,运行结果如下图 2 所示:

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_android_02


备注:

(1)“书籍名称列表”界面需采用 SimpleCursorAdapter。
(2)“资源类”文件夹中已经提供了 MyDataBaseHelper.java 和 SimpleCursorAdapter 需要使用到的布局文件 book_list.xml。
(3)“书籍名称列表”界面需通过 Intent 传递书籍 Id 至“书籍详细信息”界面,“书籍详细信息”界面再根据 Id 查询书籍详细信息。
(4)考生按照系统提示目录保存试题文件,每道试题建立一个文件夹,文件夹名为题目编号。该试题文件夹名为“2”,该文件夹内应包含 6 个文件,分别为:

  项目打包压缩文件:App2.zip
Activity 的 Java 文件(书籍名列表界面):MainActivity.java(继承 ListActivity)
Activity 的 Java 文件(书籍详细信息界面):BookActivity.java
Activity 的界面描述文件(书籍详细信息界面):activity_book.xml
程序运行界面截图:1.png(书籍名列表界面)、2.png(书籍详细信息界面)

​​返回顶部​​

三、分析

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_sqlite_03


​​返回顶部​​

四、效果展示

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_sqlite_04

五、代码解析

第一步:查询数据库信息

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_android_05


① 题干中明确给出了MyDataBaseHelper 类,用于创建数据库,并且创建​books​表同时插入数据,我们只需要调用即可,通过有参构造传入参数:当前的Activity;当我们启动应用程序后,首先​super(context, DATABASE_NAME, null, DATABASE_VERSION);​创建数据库,然后MyDataBaseHelper类中的​OnCreate()​就会被调用创建。

②于是第二步我们通过 myDataBaseHelper 获取到一个用于操作数据库的​SQLiteDatabase​实例,​getReadableDatabase()​方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

③ 这一步我们是构造查询目标列,也就是一般查询语句中的 " select * from 表;" 中的星号。

④ 在Android 查询数据是通过Cursor 类来实现的。当我们使用 ​SQLiteDatabase.query()​方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据。注意这里 query()方法的参数,​true​ 表示去重,只查唯一,后面对应图中有参数名称,很好理解。

⑤ 每一次查到数据我们在这里,遍历获取,同时将数据封装到表对应的实体类中。

⑥ 查询到的数据封装到实体类中后,我们后续还需要用到查到的数据,所以我们定义一个ArrayList<Books>,来存储每一次查询到的数据。

​​返回顶部​​

第二步:将数据适配到组件中

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_sqlite_06


① 我们首先获取到Activity1中的​ListView​组件,后面用于组配数据

② 我们调用上一步的数据库查询方法,此时的数据已经存在了ArrayList<Books>中了。

③ 这里我使用的是ArrayAdapter适配器,所以我首先将​ArrayList<Books>​中的每本书的书名取出,放入​String[] book_names​ 中,作为数据源。

④ 创建ArrayAdapter适配器,配置String类型的书名为绑定数据,android.R.layout.simple_list_item_1 为简单的列表形式。

⑤ 最后别忘了将 ArrayAdapter 适配器绑定到 ​ListView​ 控件上去。

  • 设置适配器后的效果:
  • 【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_sqlite_07

  • ​​返回顶部​​

第三步:点击item跳转Activity2,传输数据

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_android_08


① 我们首先添加ListView​item​点击事件:​setOnItemClickListener()​

② 然后利用Intent实现页面的跳转同时,传输数据。

③ 首先我们要获取要被传输的数据,ListView 中的 ​position​参数就是触发事件的 ​item​ 序号,所以我们可以通过该序号获取对应位置​ArrayList<Books>​中的​Books​对象。

Books对象就已经包含了图书的 ​info​,所以我们利用​可序列化对象​​Bundle​进行传输。①

⑤ 最后别忘了将启动 intent

​​返回顶部​​

第四步:Activity2获取Activity1传送的数据,进行页面显示

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_数据_09


① 我们首先获取info展示界面的控件

② 获取到Activity1通过Intent传输过来的数据。

③ 将对应的数据设置到对应的组件中进行展示。

  • 展示效果:
  • 【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_android_10

​​返回顶部​​

六、完整代码

两个布局

ListView布局.xml

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_sqlite_11

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SQLite.SQLiteBookActivity">

<ListView
android:id="@+id/booksView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>

Activity2布局

【Android 练习】SQLite、ListView、Intent数据传输 (综合应用)_数据_12

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SQLite.InfoActivity"
android:orientation="vertical">
<TextView
android:id="@+id/info_id"
android:layout_width="143dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginTop="14dp"
android:layout_weight="1"
android:text="_id" />
<TextView
android:id="@+id/info_name"
android:layout_width="142dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginTop="57dp"
android:layout_weight="1"
android:text="book_name" />
<TextView
android:id="@+id/info_isbn"
android:layout_width="141dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginTop="110dp"
android:layout_weight="1"
android:text="book_isbn" />
<TextView
android:id="@+id/info_author"
android:layout_width="142dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginTop="151dp"
android:layout_weight="1"
android:text="book_author" />
<TextView
android:id="@+id/info_press"
android:layout_width="141dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginTop="196dp"
android:layout_weight="1"
android:text="book_press" />
<TextView
android:id="@+id/info_price"
android:layout_width="142dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="5dp"
android:layout_marginTop="241dp"
android:layout_weight="1"
android:text="book_privce" />
</RelativeLayout>

​​返回顶部​​

数据库表实体类

package com.example.learning.SQLite;

import java.io.Serializable;

public class Books implements Serializable {
private Integer _id;
private String book_name;
private String book_isbn;
private String book_author;
private String book_press;
private Double book_price;
public Integer get_id() {
return _id;
}
public void set_id(Integer _id) {
this._id = _id;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public String getBook_isbn() {
return book_isbn;
}
public void setBook_isbn(String book_isbn) {
this.book_isbn = book_isbn;
}
public String getBook_author() {
return book_author;
}
public void setBook_author(String book_author) {
this.book_author = book_author;
}
public String getBook_press() {
return book_press;
}
public void setBook_press(String book_press) {
this.book_press = book_press;
}
public Double getBook_price() {
return book_price;
}
public void setBook_price(Double book_price) {
this.book_price = book_price;
}
@Override
public String toString() {
return "Books{" +
"_id=" + _id +
", book_name='" + book_name + '\'' +
", book_isbn='" + book_isbn + '\'' +
", book_author='" + book_author + '\'' +
", book_press='" + book_press + '\'' +
", book_price=" + book_price +
'}';
}
}

​​返回顶部​​

Activity1 查询数据展示 ListView

package com.example.learning.SQLite;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import com.example.learning.R;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class SQLiteBookActivity extends AppCompatActivity {

// 声明组件
private ListView booksView;
private List<Books> books = new ArrayList<>();

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

// 获取组件
booksView = findViewById(R.id.booksView);

find();
// 绑定ListView
// 1.获取ListView展示的书名
String[] book_names = new String[3];
for (int i = 0; i < books.size(); i++) {
book_names[i] = books.get(i).getBook_name();
}
// 添加适配器
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, book_names);
booksView.setAdapter(arrayAdapter);

// ListView 点击事件
booksView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 详情页面跳转
Intent intent = new Intent(SQLiteBookActivity.this, InfoActivity.class);
// 获取选中的图书对象
Books book = books.get(position);
// 传输图书对象
Bundle bundle = new Bundle();
bundle.putSerializable("selectedBook",book);
intent.putExtras(bundle);
// 启动
startActivity(intent);
}
});
}

// 数据库数据查询
public void find() {
// 创建 myDataBaseHelper
MyDataBaseHelper myDataBaseHelper = new MyDataBaseHelper(SQLiteBookActivity.this);
// 获取可读的数据库对象
SQLiteDatabase db = myDataBaseHelper.getReadableDatabase();
String[] columns = {"_id", "book_name", "book_isbn", "book_author", "book_press", "book_price"};
Cursor cursor = db.query(true, "books", columns, null, null, null, null, null, null);
// 遍历
while (cursor.moveToNext()) {
Books book = new Books();
book.set_id(cursor.getInt(0));
book.setBook_name(cursor.getString(1));
book.setBook_isbn(cursor.getString(2));
book.setBook_author(cursor.getString(3));
book.setBook_press(cursor.getString(4));
book.setBook_price(cursor.getDouble(5));
books.add(book);
}
}
}

​​返回顶部​​

Activity2 展示详情

package com.example.learning.SQLite;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.example.learning.R;

public class InfoActivity extends AppCompatActivity {

// 声明组件
private TextView info_id,info_name,info_isbn,info_author,info_press,info_price;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_info);
// 获取组件
info_id = findViewById(R.id.info_id);
info_name = findViewById(R.id.info_name);
info_isbn = findViewById(R.id.info_isbn);
info_author = findViewById(R.id.info_author);
info_press = findViewById(R.id.info_press);
info_price = findViewById(R.id.info_price);
// 获取到传输的数据
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
Books book = (Books) bundle.getSerializable("selectedBook");
// 设置数据
info_id.setText(String.valueOf(book.get_id()));
info_name.setText(book.getBook_name());
info_isbn.setText(book.getBook_isbn());
info_author.setText(book.getBook_author());
info_press.setText(book.getBook_press());
info_price.setText(String.valueOf(book.getBook_price()));
}
}

​​返回顶部​​

补充

以下代码是使用的SimpleCursorAdapter 适配器,稍微做了些改动,可以参考一下,更切合原题~

package com.example.Exam.e_2019;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.example.learning.R;
import java.util.ArrayList;
import java.util.List;

public class BookActivity extends AppCompatActivity {
private ListView list_book;
private MyDataBaseHelper myDataBaseHelper;
private SQLiteDatabase db;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
// 获取组件
list_book = findViewById(R.id.list_book);
// 获取查询的数据
List<Books> books = findBooks();
// 绑定Adapter
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(
this, // context
R.layout.activity_item, // ListView的item布局
cursor, // 查询获取的Cursor对象
new String[]{"book_name"},// Cursor中的字段值
new int[]{R.id.textView10},// 将上面的字段值设置到显示的item中的控件中
0
);
list_book.setAdapter(simpleCursorAdapter);
// 点击事件
list_book.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 详情页面跳转
Intent intent = new Intent(BookActivity.this, InfoActivity.class);
// 获取选中的图书对象
Books book = books.get(position);
// 传输图书对象
Bundle bundle = new Bundle();
bundle.putSerializable("selectedBook",book);
intent.putExtras(bundle);
// 启动
startActivity(intent);
}
});
}
// 定义方法查询数据库信息
public List<Books> findBooks() {
// 定义集合存储查到的图书
List<Books> books = new ArrayList<>();
// 创建DBHelper对象创建数据库
myDataBaseHelper = new MyDataBaseHelper(BookActivity.this);
// 获取可读数据库对象
db = myDataBaseHelper.getReadableDatabase();
// 声明查询的字段
String[] columns = {"_id", "book_name", "book_isbn", "book_author", "book_press", "book_price"};
cursor = db.query(true, "books", columns, null, null, null, null, null, null, null);
// 遍历获取
while (cursor.moveToNext()) {
Books book = new Books();
book.set_id(cursor.getInt(0));
book.setBook_name(cursor.getString(1));
book.setBook_isbn(cursor.getString(2));
book.setBook_author(cursor.getString(3));
book.setBook_press(cursor.getString(4));
book.setBook_price(cursor.getDouble(5));
books.add(book);
}
return books;
}
}

参考:Android中Adapter之SimpleCursorAdapter使用​​​​

参考:关于使用CursorAdapter()时出现“column ‘_id’ does not exist”错误的说明及解决方案


举报

相关推荐

0 条评论