Android 连接数据库实现登录注册功能(SQLite)

article/2025/10/14 20:40:07

什么是SQLite

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。

以下是一些关于SQLite学习的有用的网站:

1、SQLite Home Page - SQLite 官方网站提供了最新的 SQLite 安装版本,最新的 SQLite 资讯以及完整的 SQLite 教程。
2、PHP SQLite3 - 网站提供了 SQLite 3 数据库的 PHP 支持的完整细节。
3、DBD-SQLite-0.31 - SQLite Perl driver 驱动程序与 Perl DBI 模块一起使用。
4、DBI-1.625 - Perl DBI 模块为包括 SQLite 在内的任何数据库提供了通用接口。
5、SQLite Python - sqlite3 python 模块由 Gerhard Haring 编写的。它提供了与 DB-API 2.0 规范兼容的 SQL 接口。

项目简述

本次的APP主要要实现两个功能:
1、实现数据库的操作(创建数据库、存入数据——注册、查询并使用数据——登录)。
2、基本的页面跳转以及跳转时数据的携带。

布局文件

activity_main.xml
 <GridLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:rowCount="5"android:columnCount="2"><TimePickerandroid:layout_columnSpan="2"/><TextViewandroid:text="用户名:"android:layout_row="1"android:layout_column="0"android:layout_marginLeft="65dp"/><EditTextandroid:id="@+id/username"android:layout_row="1"android:layout_column="1"android:layout_marginLeft="-200dp"android:ems="7"/><TextViewandroid:text="密码:"android:layout_row="2"android:layout_column="0"android:layout_marginLeft="80dp"/><EditTextandroid:id="@+id/password"android:layout_row="2"android:layout_column="1"android:inputType="textPassword"android:layout_marginLeft="-200dp"android:ems="7"/><LinearLayoutandroid:weightSum="1.5"android:layout_gravity="center"android:layout_marginTop="20dp"android:layout_marginLeft="50dp"><Buttonandroid:id="@+id/login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"android:layout_weight="0.5"/><Buttonandroid:id="@+id/resign"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册"android:layout_weight="0.5" /><Buttonandroid:id="@+id/btn_new"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="重置"android:layout_weight="0.5"/></LinearLayout><DatePickerandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="invisible"android:layout_columnSpan="2"/></GridLayout>

效果如下:
在这里插入图片描述

activity_success.xml
  <LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="网上购书系统"android:textSize="25dp"android:textColor="@android:color/holo_blue_light"/><TextViewandroid:id="@+id/tv_welcome"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="xxx 您好"android:textSize="25dp"android:textColor="@android:color/holo_red_light"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="欢迎光临"android:textSize="20dp"android:textColor="@android:color/holo_red_light"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:src="@drawable/hello"/><TextViewandroid:id="@+id/tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录时间:xxxx-xx-xx"android:layout_marginTop="10dp"/><Buttonandroid:id="@+id/btn_back"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:text="返回"android:textSize="20dp"/></LinearLayout>

效果如下:
在这里插入图片描述

activity_fault.xml
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="网上购书系统"android:textSize="25dp"android:textColor="@android:color/holo_blue_light"/><TextViewandroid:id="@+id/tv_welcome"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密码错误!"android:textSize="25dp"android:textColor="@android:color/holo_red_light"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:src="@drawable/hello"/><TextViewandroid:id="@+id/tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请返回重新登录"android:layout_marginTop="10dp"/><Buttonandroid:id="@+id/btn_back"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:text="返回"android:textSize="20dp"/></LinearLayout>

效果如下:
在这里插入图片描述

数据库的创建

要想实现安卓app连接数据库,首先我们要创建一个我们所需要的数据库,值得一提的是,因为是移动设备上的app,所以这个数据库的应用和web的数据库还是有一些区别的,最显著的一点就是我们要用代码来实现数据库的创建,并且这个数据库是直接保存在我们的移动设备上的。

DateBaseHelper.java

这里面我们撰写了DateBaseHelper这个类来实现SQLiteOpenHelper这个方法。

/**
*DATEBASE_NAME是我们数据库的名字,VERSION_CODE是数据库的版本号,
*TABLE_NAME是我们数据库中的表的名字;
*像这种常量我们之后会定义到Constants.java文件中
*/
public class DateBaseHelper extends SQLiteOpenHelper {private static final  String TAG="DatabaseHelper";public DateBaseHelper(@Nullable Context context) {super(context, Constants.DATEBASE_NAME, null, Constants.VERSION_CODE);}  //创建数据库(这只会在程序第一次运行时生效,db文件会被储存在移动设备中,下次运行不会重复创建)public void onCreate(SQLiteDatabase db) {Log.d(TAG,"创建数据库...");//创建数据库中的字段,这里只创建了一个name字段和一个password字段String sql ="create table "+Constants.TABLE_NAME+"(name varchar(20),password varchar(20))";db.execSQL(sql);}//实现增public void insert(SQLiteDatabase sqLiteDatabase, String name,String password){//声明键值对valuesContentValues values=new ContentValues();//分别插入名为name和password的值到键值对values的"name"和"password"字段中values.put("name",name);values.put("password",password);//将键值对values插入到数据库中sqLiteDatabase.insert(Constants.TABLE_NAME,null,values);}public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//升级数据库时的回调(升级前需要更改版本号)Log.d(TAG,"升级数据库...");}
}
Constants.java
public class Constants {public static String DATEBASE_NAME="10_14homework.db";//数据库名public static int VERSION_CODE= 1;//版本号public static final String TABLE_NAME="customers";//表名
}

APP的编写

DateUtil.java

因为我们的app在登陆后有一个实时返回登录时间的功能,如下图:
在这里插入图片描述
为了让时间能按照我们预想的格式输出,所以我撰写了一个DateUtil类来存放时间的格式,其实这里面就只用到了一个类:SimpleDateFormat(格式化地输出系统时间)

public class DateUtil {
//这里列举了3个比较常用的时间展现格式,这个自由度很高,可以根据自己的需求来设计public static String getNowDateTime() {//年-月-日 时:分:秒SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(new Date());}public static String getNowTime() {//时:分:秒SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); return sdf.format(new Date());}public static String getNowTimeDetail() {//时:分:秒.毫秒SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");  return sdf.format(new Date());}}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//变量声明SQLiteDatabase sqLiteDatabase;DateBaseHelper helper;private EditText username;private EditText password;private String name_str;private String paswd_str;private Button resign;private Button login;private Button btn_new;private String mstr="";private final static String TAG="MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//控件定位helper=new DateBaseHelper(this);  //传递上下文username=(EditText) findViewById(R.id.username);password=(EditText) findViewById(R.id.password);resign=(Button) findViewById(R.id.resign);login=(Button) findViewById(R.id.login);btn_new=(Button)findViewById(R.id.btn_new);//①以读写的方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错//②还有一个getReadableDatabase()方法也是以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试//以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。sqLiteDatabase = helper.getWritableDatabase();//设置按钮监听resign.setOnClickListener(this);login.setOnClickListener(this);btn_new.setOnClickListener(this);}@Overridepublic void onClick(View v) {// 通过id来分配按钮事件switch (v.getId()) {//注册按钮功能case R.id.resign://注册相关的弹窗设定,如果确定提交,则完成注册,数据存入数据库//AlerDialog:对话框控件new AlertDialog.Builder(MainActivity.this).setTitle("系统提示").setMessage("是否确定提交?")//为确定按钮配置监听.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// 获取EditView中的内容,并将其转化成字符串型后存入变量中name_str = username.getText().toString();paswd_str = password.getText().toString();//给数据表设置游标,Cursor是一个游标,以name字段为依据,query是一种根据条件获取数据的方法Cursor cursor = sqLiteDatabase.query(Constants.TABLE_NAME, new String[]{"name"}, "name=?", new String[]{name_str}, null, null, null);//如果游标找到了所需要的name,则返回已注册,否则就利用之前写的insert方法插入数据if (cursor.getCount() != 0) {Toast.makeText(MainActivity.this, "该用户已注册!", Toast.LENGTH_SHORT).show();} else {helper.insert(sqLiteDatabase, name_str, paswd_str);Toast.makeText(MainActivity.this, "注册成功,请登录!", Toast.LENGTH_SHORT).show();}}}).setNegativeButton("返回", new DialogInterface.OnClickListener() {public void onClick(DialogInterface arg0, int arg1) {//这个是点击返回后的操作,因为不需要,所以不管他直接跳出就好。}}).show();break;//登录按钮功能,上面解释过的已省略case R.id.login:String user_str = username.getText().toString();String psw_str = password.getText().toString();//账号或密码为空时if (user_str.equals("")) {Toast.makeText(this, "账号或密码不能为空", Toast.LENGTH_SHORT).show();}else {Cursor cursor = sqLiteDatabase.query(Constants.TABLE_NAME, new String[]{"password"}, "name=?", new String[]{user_str}, null, null, null);//游标的遍历,寻找name对应的password的值if(cursor.moveToNext()){String psw_query=cursor.getString(cursor.getColumnIndex("password"));//用户名对应的密码与输入的密码相同时if(psw_str.equals(psw_query)){Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();//跳转到successActivity页面Intent intent=new Intent (MainActivity.this,successActivity.class);//intent会携带上mstr的值并以username命名intent.putExtra("username",mstr);//开始跳转事件startActivity(intent);break;}//密码输入错误时else{//跳转到FaultActivity页面Intent intent2=new Intent(MainActivity.this,FaultActivity.class);startActivity(intent2);}}//遍历完后发现在表中找不到游标携带的name的值时else{Toast.makeText(this, "账号不存在,请先注册!", Toast.LENGTH_SHORT).show();}}break;//重置按钮功能case R.id.btn_new://将EditView的文本清空username.setText("");password.setText("");break;default:break;}}
}

登录成功和失败后的页面编写

successfulActivity.java
public class successActivity extends AppCompatActivity implements View.OnClickListener {//变量声明private String mStr="";private String mTime;private final static String TAG="successActivity";private TextView tv_welcome;private TextView tv_time;private Button btn_back;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_success);btn_back=(Button)findViewById(R.id.btn_back);logintime();welcome();btn_back.setOnClickListener(this);}//返回登录时间private void logintime() { tv_time=(TextView)findViewById(R.id.tv_time);//用DateUtil中的getNowDateTime格式返回登录时间mTime = String.format("登录时间 %s", DateUtil.getNowDateTime());tv_time.setText(mTime);}//将之前跳转时携带的用户信息用到欢迎界面中private void welcome(){//获取intentIntent intent=getIntent();//获取intent中名为username的数据的值String username = intent.getStringExtra("username");tv_welcome=(TextView)findViewById(R.id.tv_welcome);mStr=String.format("%s 您好", username);tv_welcome.setText(mStr);}@Override//返回  实现跳转回到登录界面public void onClick(View v) {Intent intent2=new Intent(successActivity.this,MainActivity.class);startActivity(intent2);}
}
FaultActivity.java
//这个页面没有什么花里胡哨的
public class FaultActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_back;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fault);btn_back=(Button)findViewById(R.id.btn_back);btn_back.setOnClickListener(this);}@Overridepublic void onClick(View v) {Intent intent=new Intent(FaultActivity.this,MainActivity.class);startActivity(intent);}
}

http://chatgpt.dhexx.cn/article/Wt6FbYJ6.shtml

相关文章

达梦数据库入门

测试版本&#xff1a;达梦6 主要内容&#xff1a;数据库登录、数据库创建、用户创建、授权等。 说明&#xff1a;数据库有两种方式常用的使用方式&#xff0c;有达梦自带的比较友好的达梦管理工具&#xff0c;比较适用于新手。这里主要介绍的是第二种方式,命令行方式。 一、达梦…

登录页面连接数据库

壹 如果每一款APP的登录界面审核机制为 " admin".equles(username)&&"123456".equles(password)那么局限性太高&#xff0c;数据成本高&#xff0c;我们之所以连接数据库&#xff0c;是因为APP对应着多个用户&#xff0c;而不是一个用户。 贰 &a…

java完成登录页面+连接数据库

java完成登录页面连接数据库 所用的包简单介绍&#xff1a; 部分资料来自网上&#xff0c;如有侵权联系删除。 ActionEvent:处理东、南、西、北四个按钮&#xff0c;以及文本框的actionevent事件。当事件发生&#xff0c;&#xff0c;监视器计算字符的长度&#xff0c;并在命…

Java实现登录[数据库]

和上篇的随机点名系统一样&#xff0c;都是使用MySQL数据库来实现&#xff0c;因为刚学所以写点简单例子满足下自己&#xff1b; 需求分析&#xff1a; 1、输入用户名和密码 2、与数据库中的记录进行比较 原理比较 简单&#xff0c;直接贴代码吧。 import java.sql.Connec…

sql数据库身份验证登录

工具&#xff1a;SQL Server&#xff08;我使用的是SQL Server&#xff09; 步骤&#xff1a; 1、打开SQL Server&#xff0c;先选择Windows身份验证登录 2、定位到[服务器/安全性/登录名],可以选择其中有的登录来登录&#xff0c;也可以自己创建登录名来登录。 3、[自建登录…

禅道登录数据库方法

1、登录zentao数据库 先付权限给/opt/zbox/auth/users&#xff08;命令&#xff1a;sudo chmod -R 777 users&#xff09; 然后在路径下执行/opt/zbox/auth ./adduser.sh &#xff0c;添加admin账密 2、进入到数据库管理界面 3、进入后登录数据库 系统&#xff1a;MySQL&am…

Oracle数据库登录报错 ORA-12541:TNS:no listener(记录)

重启虚机的时候,有时会变更数据库的tns配置,导致数据库连接报错,导致自己的服务启动失败 解决方案:重启数据库,重启TNS监听 &#xff08;1&#xff09; 登录oracle数据库&#xff0c;命令&#xff1a;su - oracle (如果登录失败,尝试切换root用户后登录) &#xff08;2&#…

达梦:如何登录数据库(基础篇)

登录达梦数据库有两种方式&#xff0c;包括使用disql命令行工具登录和DM管理工具登录。 1.disql命令行工具登录 dIsql 是 DM 数据库自带的工具&#xff0c;只要安装了 DM 数据库&#xff0c;就可以在应用菜单和安装目录中 找到。 查看方式&#xff1a; ps -ef|grep dmse…

达梦数据库登录账户限制说明

前言 密码太多&#xff1f;总是忘记&#xff0c;尝试登录&#xff0c;结果账户被锁定。为防止别人恶意破解登录&#xff0c;输入密码错误多少次就锁定账号、锁定多长时间、全都由我们自己来定&#xff01; 今天我们就来详细剖析DM数据库登录账户的限制方式。 测试 我们先建立…

达梦数据库——数据库登录 / 连接失败原因整理..

在数据库的使用过程中&#xff0c;不可避免的会遇到数据库连接不上&#xff0c;数据库登录失败等等等等....问题。 以下是我个人遇到的一些相关问题的整理。 常见问题&#xff1a;连接数据库异常排查思路报错信息网络通信异常、创建socket连接失败、用户名密码错误、用户被锁…

命令行登录数据库

命令行登录数据库 登录自己数据库 命令说明mysql -u 用户名 -p 密码使用指定用户名和密码登录当前计算机中的MySQL数据库 登录本机&#xff1a;mysql -uroot -p123456 登录别人数据库 命令说明mysql -h 主机IP -u 用户名 -p 密码-h 指定IP 方式,进行 登录 登录其它设备数…

人大金仓数据库登录、查看数据库

启动数据库服务测试 ​ 1、查看数据存储目录 [rootnode1 ~]# su - kingbase Last login: Mon Mar 1 18:00:48 CST 2021 on pts/2 [kingbasenode1 ~]$ cd /data/kingbase/v8/data/ [kingbasenode1 data]$ ls -lh 登录后复制 [kingbasenode1 bin]$ ./ksql -U system -W t…

数据库服务的运行与登录

一、打开数据库服务 1、数据库服务 :SQL Server&#xff08;MSSQLServer&#xff09; 1&#xff09;运行在服务器端的应用程序&#xff0c;提供数据的存储、处理和事物等。 2&#xff09;在使用DBMS客户端之前&#xff0c;必须首先打开该服务。 2、打开与关闭的方式 1&#xf…

登录数据库详解

登录数据库 1 . 双击以下&#xff1a; 2 . 进入数据库输入密码点击连接&#xff1a; 3 . 连接成功的话进入这个页面就代表完成了&#xff1b;要是连接不成功请动动你的小手往下拉&#xff1b; 不成功连接一 4 . 连接不成功的情况下万一出现以下这状况 : 5 . 先关闭这个“无法连…

python3.8.2使用web.py做web开发

web.py是适用于Python的Web框架&#xff0c;功能强大而又简单。web.py是公共领域&#xff1b;您可以毫无限制地将其用于任何目的。 一、安装方式 PIP方式 pip install web.py0.51最新0.51版本同时支持Python 2.7和Python> 3.5。 从GitHub获取最新的开发版本 解压&#xf…

web—2

2.基础入门——数据包拓展 网站解析对应 攻击层面&#xff1f; 源码&#xff0c;搭建平台&#xff0c;系统&#xff0c;网络层等 安全问题&#xff1f; 目录&#xff0c;敏感文件&#xff0c;弱口令&#xff0c;IP以及域名 HTTP/S—数据包 • https协议需要到ca申请证书&#…

Python 3 web开发

文章目录 web开发发展历程HTTP协议简介实验环境HTTP内容简介HTTP请求HTTP格式推荐文档 HTML简介CSS简介JavaScript简介小结 WSGI接口简介运行WSGI服务小结 web框架常见Python web框架小结 使用模板小结 总结推荐文档实验文件 web开发发展历程 Python有上百种web开发框架&#x…

WEB:web2

背景知识 代码审计 题目 由上述可知&#xff0c;这段代码定义了一个函数encode&#xff0c;接受一个字符串参数$str&#xff0c;并返回对其进行加密后的结果 加密算法包括&#xff1a; 使用strrev函数将字符串进行翻转&#xff1b;对翻转后的每个字符&#xff0c;将其ASCII值…

Web3.py 学习(一)

一、什么是Web3.py Web3.py is a python library for interacting with Ethereum. Its API is derived from the Web3.js Javascript API and should be familiar to anyone who has used web3.js. Web3.py是连接以太坊的python库&#xff0c;它的API从web3.js中派生而来。如果…

Web基础(三)Python Web

文章目录 Python Web基础1. WSGI1.1 概述1.2 实现原理1、WSGI Server/gateway2、WSGI Application3、WSGI MiddleWare 1.3 测试 WSGI服务器代码简析 1.4 实现WSGI服务器1.5 生产环境中的Web服务器[Gunicorn](https://github.com/benoitc/gunicorn "Gunicorn")[uWSGI …