在移动客户端访问服务器端,会下载数据到客户端,如果有些信息变化量或者更新周期比较小,那么就可以在第一次登录时,把数据下载到客户端的轻型数据库SQLite中,这样就可以在每次需要查询信息时,都需要访问服务器一次,可以在本地进行查询。当服务器端数据有变化时,再下发通知到客户端,提醒进行手动更新数据。
今天本例先进行上述功能的前半部分:实现在客户端本地数据库的数据写入和读取,读取后显示在listview中。
目录
一、layout设计
1、activity_main.xml
此布局是主界面,查询和显示学生信息。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sqlite"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/device_lable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.6"
android:layout_marginTop="0dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="20dp"
android:text="学生列表"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:orientation="horizontal">
<EditText
android:id="@+id/search_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="@string/search_et_hint" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1.2"
android:gravity="center"
android:textColor="@color/forestgreen"
android:textSize="18dp"
android:text="学号"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.2"
android:gravity="center"
android:textColor="@color/forestgreen"
android:textSize="18dp"
android:text="姓名"/>
<TextView
android:id="@+id/tv_gender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.8"
android:gravity="center"
android:textColor="@color/forestgreen"
android:textSize="18dp"
android:text="性别"/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.8"
android:gravity="center"
android:textColor="@color/forestgreen"
android:textSize="18dp"
android:text="年龄"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.99"
android:layout_marginBottom="40dp"
android:orientation="vertical">
<ListView
android:id="@+id/lv_student"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="0dp"
android:gravity="center"
>
</ListView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center"
android:layout_marginBottom="0dp"
android:orientation="horizontal">
<Button
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:background="@drawable/button0"
android:textSize="20dp"
android:text="@string/search"
/>
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:background="@drawable/button0"
android:textSize="20dp"
android:text="@string/add"
/>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
2、lv_student_layout.xml
此layout是activity_main.xml中listview型lv_student容器中的具体布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="5dp"
android:layout_marginLeft="0dp">
<TextView
android:id="@+id/str_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1"
android:textSize="14dp"
android:gravity="center"
/>
<TextView
android:id="@+id/str_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1"
android:textSize="14dp"
android:gravity="center"
/>
<TextView
android:id="@+id/str_gender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1"
android:textSize="14dp"
android:gravity="center"
/>
<TextView
android:id="@+id/str_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1"
android:textSize="14dp"
android:gravity="center"
/>
</LinearLayout>
3、activity_add.xml
此布局是添加学生信息的界面。
<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/bg_stoke_black2"
android:orientation="vertical"
tools:context="com.example.mysqlite.AddActivity">
<!--输入添加单词词-->
<EditText
android:id="@+id/add_no"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="@string/add_no_hint" />
<!--输入添加解释-->
<EditText
android:id="@+id/add_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="@string/add_name_hint" />
<EditText
android:id="@+id/add_gender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="@string/add_gender_hint" />
<!--输入添加解释-->
<EditText
android:id="@+id/add_age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="@string/add_age_hint" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!--保存按钮-->
<Button
android:id="@+id/save_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="120dp"
android:layout_marginTop="180dp"
android:background="@drawable/button0"
android:text="@string/save"
android:src="@drawable/button0" />
<!--取消按钮-->
<Button
android:id="@+id/cancel_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="180dp"
android:background="@drawable/button0"
android:text="@string/cancel"
android:src="@drawable/button0" />
</LinearLayout>
</LinearLayout>
二、jave程序
1、DBOpenHelper类
这是构建SQLiteDatabase数据库名、数据库中表的类。
package com.example.mysqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Administrator.
*/
public class DBOpenHelper extends SQLiteOpenHelper {
//定义创建数据表dict的SQL语句
final String CREATE_TABLE_SQL =
"create table student(id integer primary key autoincrement ,str_no,str_name,str_gender,str_age)";
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, null, version); //重写构造方法并设置工厂为null
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL); //创建文件信息表
}
@Override
// 重写基类的onUpgrade()方法,以便数据库版本更新
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//提示版本更新并输出旧版本信息与新版本信息
System.out.println("---版本更新-----" + oldVersion + "--->" + newVersion);
}
}
2、主程序MainActivity.java
package com.example.mysqlite;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper; //定义DBOpenHelper
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建DBOpenHelper对象,指定名称、版本号并保存在databases目录下
dbOpenHelper = new DBOpenHelper(MainActivity.this, "student.db", null, 1);
final ListView listView = (ListView) findViewById(R.id.lv_student); //获取显示结果的ListView
Button btnSearch= this.findViewById(R.id.search); //获取查询按钮
Button btn_add= this.findViewById(R.id.add); //获取取消按钮
final EditText etSearch=this.findViewById(R.id.search_file); //获取搜索框
btn_add.setOnClickListener(new View.OnClickListener() { //单击添加生词按钮,实现跳转到添加生词的界面
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class); //通过Intent跳转添加学生界面
startActivity(intent);
}
});
btnSearch.setOnClickListener(new View.OnClickListener() { //单击查询按钮,实现查询词库中的单词
@Override
public void onClick(View v) {
String str_no = etSearch.getText().toString(); //获取要查询的学号
//查询学生
Cursor cursor=dbOpenHelper.getReadableDatabase().query("student",null
,"str_no = ?",new String[]{str_no},null,null,null);
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); //创建ArrayList对象,用于保存查询出的结果
while (cursor.moveToNext()) { // 遍历Cursor结果集
Map<String, String> map = new HashMap<>(); // 将结果集中的数据存入HashMap中
// 取出查询记录中第2列、第3列的值
map.put("str_no", cursor.getString(1));
map.put("str_name", cursor.getString(2));
map.put("str_gender", cursor.getString(3));
map.put("str_age", cursor.getString(4));
// System.out.println(cursor.getString(0));
// System.out.println(cursor.getString(1));
// System.out.println(cursor.getString(2));
// System.out.println(cursor.getString(3));
// System.out.println(cursor.getString(4));
resultList.add(map); //将查询出的数据存入ArrayList中
}
if (resultList == null || resultList.size() == 0) { //如果数据库中没有数据
// 显示提示信息,没有相关记录
Toast.makeText(MainActivity.this, "没有相关信息", Toast.LENGTH_LONG).show();
} else {
// 否则将查询的结果显示到ListView列表中
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList,
R.layout.lv_student_layout,
new String[]{"str_no", "str_name", "str_gender","str_age"}, new int[]{
R.id.str_no, R.id.str_name, R.id.str_gender,R.id.str_age});
listView.setAdapter(simpleAdapter);
}
}
});
}
@Override
protected void onDestroy() { //实现退出应用时,关闭数据库连接
super.onDestroy();
if (dbOpenHelper != null) { //如果数据库不为空时
dbOpenHelper.close(); //关闭数据库连接
}
}
}
3、添加数据AddActivity.java
package com.example.mysqlite;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class AddActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper; //定义DBOpenHelper,用于与数据库连接
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
//创建DBOpenHelper对象,指定名称、版本号并保存在databases目录下
dbOpenHelper = new DBOpenHelper(AddActivity.this, "student.db", null, 1);
final EditText et_no=(EditText)findViewById(R.id.add_no); //获取添加学号的编辑框
final EditText et_name=(EditText)findViewById(R.id.add_name); //获取添加姓名的编辑框
final EditText et_gender=(EditText)findViewById(R.id.add_gender); //获取添加性别的编辑框
final EditText et_age=(EditText)findViewById(R.id.add_age); //获取添加年龄的编辑框
Button btn_Save= this.findViewById(R.id.save_btn); //获取保存按钮
Button btn_Cancel= this.findViewById(R.id.cancel_btn1); //获取取消按钮
btn_Save.setOnClickListener(new View.OnClickListener() { //实现将添加的单词解释保存在数据库中
@Override
public void onClick(View v) {
String str_no = et_no.getText().toString(); //获取填写的学号
String str_name = et_name.getText().toString(); //获取填写的姓名
String str_gender = et_gender.getText().toString(); //获取填写的性别
String str_age = et_age.getText().toString(); //获取填写的年龄
if (str_no.equals("")||str_name.equals("")||str_gender.equals("")||str_age.equals("")){ //如果填写的内容有空项时
Toast.makeText(AddActivity.this, "填写的内容不能为空项", Toast.LENGTH_SHORT).show();
}else {
// 调用insertData()方法,实现插入学生数据
insertData(dbOpenHelper.getReadableDatabase(), str_no,str_name, str_gender,str_age);
// 显示提示信息
Toast.makeText(AddActivity.this, "添加成功!", Toast.LENGTH_LONG).show();
}
}
});
btn_Cancel.setOnClickListener(new View.OnClickListener() { //实现返回查询单词界面
@Override
public void onClick(View v) {
Intent intent=new Intent(AddActivity.this,MainActivity.class); //通过Intent跳转查询学生界面
startActivity(intent);
}
});
}
//创建insertData()方法实现插入数据
private void insertData(SQLiteDatabase readableDatabase, String str_no, String str_name, String str_gender,String str_age) {
ContentValues values=new ContentValues();
values.put("str_no", str_no); //保存学号
values.put("str_name", str_name); //保存姓名
values.put("str_gender", str_gender); //保存性别
values.put("str_age", str_age); //保存年龄
readableDatabase.insert("student",null , values);//执行插入操作
}
}