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

什么是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);
                                //如果游标找到了所需要的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"}, new String[]{user_str}, 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);
    }
}

原文地址:https://blog.csdn.net/weixin_52908396

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="