irpas技术客

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

网络投稿 1582

什么是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 <GridLayout android:layout_width="match_parent" android:layout_height="match_parent" android:rowCount="5" android:columnCount="2"> <TimePicker android:layout_columnSpan="2"/> <TextView android:text="用户名:" android:layout_row="1" android:layout_column="0" android:layout_marginLeft="65dp" /> <EditText android:id="@+id/username" android:layout_row="1" android:layout_column="1" android:layout_marginLeft="-200dp" android:ems="7" /> <TextView android:text="密码:" android:layout_row="2" android:layout_column="0" android:layout_marginLeft="80dp" /> <EditText android:id="@+id/password" android:layout_row="2" android:layout_column="1" android:inputType="textPassword" android:layout_marginLeft="-200dp" android:ems="7" /> <LinearLayout android:weightSum="1.5" android:layout_gravity="center" android:layout_marginTop="20dp" android:layout_marginLeft="50dp" > <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" android:layout_weight="0.5" /> <Button android:id="@+id/resign" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册" android:layout_weight="0.5" /> <Button android:id="@+id/btn_new" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重置" android:layout_weight="0.5" /> </LinearLayout> <DatePicker android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="invisible" android:layout_columnSpan="2"/> </GridLayout>

效果如下:

activity_success.xml <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="网上购书系统" android:textSize="25dp" android:textColor="@android:color/holo_blue_light" /> <TextView android: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" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="欢迎光临" android:textSize="20dp" android:textColor="@android:color/holo_red_light" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:src="@drawable/hello"/> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录时间:xxxx-xx-xx" android:layout_marginTop="10dp" /> <Button android: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 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="网上购书系统" android:textSize="25dp" android:textColor="@android:color/holo_blue_light" /> <TextView android: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" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:src="@drawable/hello"/> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请返回重新登录" android:layout_marginTop="10dp" /> <Button android: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){ //声明键值对values ContentValues 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"; @Override protected 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); } @Override public void onClick(View v) { // 通过id来分配按钮事件 switch (v.getId()) { //注册按钮功能 case R.id.resign: //注册相关的弹窗设定,如果确定提交,则完成注册,数据存入数据库 //AlerDialog:对话框控件 new AlertDialog.Builder(MainActivity.this).setTitle("系统提示") .setMessage("是否确定提交?") //为确定按钮配置监听 .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public 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; @Override protected 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(){ //获取intent Intent 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fault); btn_back=(Button)findViewById(R.id.btn_back); btn_back.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent=new Intent(FaultActivity.this,MainActivity.class); startActivity(intent); } }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #android登录注册数据库 #sqlite #home #page #官方网站提供了最新的