利用SQLiteOpenHelper实现SQLite数据的写入和查询

本文档详细介绍了如何在Android客户端使用SQLite数据库存储和检索学生信息。布局设计包括主界面、学生列表布局和添加学生界面。在主程序中,实现了查询和显示数据的功能,而添加数据的活动则允许用户输入学生信息并保存到数据库。
摘要由CSDN通过智能技术生成

在移动客户端访问服务器端,会下载数据到客户端,如果有些信息变化量或者更新周期比较小,那么就可以在第一次登录时,把数据下载到客户端的轻型数据库SQLite中,这样就可以在每次需要查询信息时,都需要访问服务器一次,可以在本地进行查询。当服务器端数据有变化时,再下发通知到客户端,提醒进行手动更新数据。

今天本例先进行上述功能的前半部分:实现在客户端本地数据库的数据写入和读取,读取后显示在listview中。

目录

一、layout设计

1、activity_main.xml

2、lv_student_layout.xml

3、activity_add.xml

二、jave程序

1、DBOpenHelper类

2、主程序MainActivity.java

3、添加数据AddActivity.java

三、测试


一、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);//执行插入操作
    }
}

三、测试

添加学生数据

查询并显示

要将人脸数据写入SQLite,需要遵循以下步骤: 1. 创建一个SQLite数据库。在Android Studio中,可以通过SQLiteOpenHelper类来创建和管理数据库。创建一个类来扩展SQLiteOpenHelper,并在onCreate方法中创建表来存储人脸数据。 2. 在应用程序中使用人脸识别API来检测和识别人脸。人脸识别API可用于检测和识别人脸,并提供有关面部特征的信息,例如眼睛位置和嘴巴位置。 3. 将人脸数据存储在SQLite数据库中。一旦检测到人脸并识别出其面部特征,就可以将其存储在SQLite数据库中。可以使用SQLiteDatabase类来插入新的数据行。 4. 在应用程序中使用SQLite数据库。要在应用程序中使用SQLite数据库,需要创建一个SQLiteOpenHelper实例并使用它来获取一个可写的SQLite数据库。然后可以使用SQLiteDatabase类来查询和更新数据库中的数据。 以下是一个示例代码片段,演示如何将人脸数据写入SQLite: ```java public class FaceDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "face_database.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "faces"; private static final String COLUMN_ID = "id"; private static final String COLUMN_NAME = "name"; private static final String COLUMN_IMAGE = "image"; public FaceDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String createTable = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT, " + COLUMN_IMAGE + " BLOB)"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public void addFace(String name, Bitmap image) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, name); values.put(COLUMN_IMAGE, getBytes(image)); db.insert(TABLE_NAME, null, values); db.close(); } public List<Face> getAllFaces() { List<Face> faces = new ArrayList<>(); SQLiteDatabase db = getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID)); String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME)); byte[] imageBytes = cursor.getBlob(cursor.getColumnIndex(COLUMN_IMAGE)); Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); Face face = new Face(id, name, image); faces.add(face); } while (cursor.moveToNext()); } cursor.close(); db.close(); return faces; } private static byte[] getBytes(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream); return stream.toByteArray(); } } ``` 在上面的代码中,FaceDatabaseHelper类扩展SQLiteOpenHelper,并在其onCreate方法中创建一个名为“faces”的表,该表具有三个列:id,name和image。id是自动增长的主键,name是一个字符串,image是一个BLOB(二进制大对象)类型,用于存储人脸图像。 该类还包括两个方法:addFace和getAllFaces。addFace方法将人脸数据插入SQLite数据库中,getAllFaces方法返回一个包含所有存储的人脸的列表。 要将人脸数据写入SQLite,可以调用addFace方法,如下所示: ```java FaceDatabaseHelper helper = new FaceDatabaseHelper(context); helper.addFace("John", bitmap); ``` 其中,context是一个上下文对象,bitmap是一个表示人脸图像的Bitmap对象。 要检索存储的所有人脸,请调用getAllFaces方法,如下所示: ```java FaceDatabaseHelper helper = new FaceDatabaseHelper(context); List<Face> faces = helper.getAllFaces(); ``` 其中,context是一个上下文对象,faces是一个包含所有存储的人脸的列表。每个Face对象都包含人脸的id,name和image。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值