安卓开发之数据库——SQLite的详细介绍,详细到连Alt+回车都有说

安卓原生数据库SQLite的小白级使用方法。自己刚开始学的时候踩过的坑,给大家标出来,供大家参考,也算是记录我的学习过程,我将以用户注册验证登录信息为例。

刚开始学的时候,数据库的查询方法在网上看了很多,视频啊、博文等等,都没有我要的效果,讲的说实话我有点看不懂,毕竟刚开始学嘛。思路就是用户注册即信息入库;用户登录即查询数据库,对表,看信息与输入是否一致。好了废话就这么多,赶紧让我们来看看吧:

所有数据库的操作无畏乎就增、删、改、查四种操作,而对于初学者来说最难的当然是查了,毕竟排在最后一位嘛,嘿嘿嘿其实这也是次要的,最主要它是有七个参数的。赶紧让我们开始学习:

要用安卓的SQLite数据库,有以下常用步骤:
1.创建一个数据库的使用类,让它继承SQLiteOpenHelper;
2.然后重写他的onCreate、onUpgrade两个方法(如图可以继承完在报红的那里按Alt+回车,选择implement methods 意思是实现方法)

在这里插入图片描述
然后选择这两个方法,实现他们;

在这里插入图片描述
这样的话它就会自动帮你创建好这两个方法。以上步骤执行完毕,还报错,跟上述步骤一样,Alt+回车,实现他的构造方法。然后如图还报错,把红色以前的删掉,
在这里插入图片描述
然后直接使用就可以了;
onCreate只会在创建数据库的时候调用;onUpgrade方法会在升级数据库的时候调用;
3.然后在onCreate方法里执行建表语句,建表语句可以写在onCreate方法里边,也可以直接写在类里边,都可以;以下是建表语句:

//table后面的是表名
String CREATE_TABLE = "create table user_info(" +
        "id integer primary key autoincrement," +     //这一句表示创建一个id,一个自增的id
        //第一个参数是列名称,第二个参数是类型;因为我存用户名称、密码、电话号码这些用文本类型存储都可以,所以我这里用文本类型存;
        "user_name text," +  
        "user_password text," +
        "user_tel text)";

建表语句写好后就可以在onCreate里创建表了,具体语句看代码实例:

public  class SQLuse extends SQLiteOpenHelper {
    String CREATE_TABLE = "create table user_info(" +
            "id integer primary key autoincrement," +
            "user_name text," +
            "user_password text," +
            "user_tel text)";
    public SQLuse(Context context,String name,SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

如果写正确了就是我这个样子哦,没有别的颜色的提示:

在这里插入图片描述
好了,这样的话就有可以用的数据库类了;
然后在要用的地方给它new出来,当然我这儿是要在注册的时候new一次,登录的时候new一次;
先看注册的方法;
先写提交按钮的点击事件,在点击了提交按钮后,判断所有信息是否填写完整,两次密码是否一致;

所有的注册代码,一些东西写在了注释里面,别看这么多,其实好多是重复的,为了方便理解,我就多复制了几次,其实东西就一点点:
public class Main2Activity extends AppCompatActivity {
    private EditText mInUserName;
    private EditText mInUserPass;
    private EditText mInPassAgain;
    private EditText mInTel;
    private Button mButton3;
    SQLiteDatabase db;
    SQLiteOpenHelper sql;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initID();
        //对咋们的数据库类进行实例化;这儿的参数就是咋们留在那边的,删剩下的东西;
        //第一个参数是上下文,第二个数据库文件的名称,第三个工厂号,填null就可以了,最后一个是版本号
        sql = new SQLuse(Main2Activity.this,"userInfo.db",null,1);
        //提交按钮的点击事件
        mButton3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //点击之后判断并给出提示
                getStata();
            }
        });

    }
    //判断方法,判断是否满足注册条件;即信息是否填写完整,两次密码是否一致;
    private void getStata() {
        //控件实例化
        initID();
        //获取文本框输入的值
        String userName = mInUserName.getText().toString();
        String userPass = mInUserPass.getText().toString();
        String userPassAgain = mInPassAgain.getText().toString();
        String userTel = mInTel.getText().toString();
        //对输入的值进行判断,如果有一个为空,调用nulltip方法;弹出为空提示窗
        if (userName.equals("") || userPass.equals("") || userTel.equals("")){
            nullTip();
        }else {
            //如果有两次密码不一致,调用disliketip方法,弹出密码不一致提示框
            if (!userPass.equals(userPassAgain)){
                disLikeTip();
            }else {
                //否则执行入库方法putInStorage
                putInStorage(userName,userPass,userTel);
            }
        }
    }
    //注册方法(数据入库方法)
    private void putInStorage(String name,String psd,String tel) {
        /*这里对咋们的操作数据库的方法进行实例化;用数据库帮助类点一下他的getReadableDatabase方法
        或者getWritableDatabase,两个方法的实例都可以对数据库进行操作,区别在于第一个如果内存满了等等原因,它会执行只读而不写入;
        第二个遇上内存占满等等原因就会报错
         */
        db = sql.getReadableDatabase();
                ContentValues values = new ContentValues();
                values.put("user_name",name);
                values.put("user_password",psd);
                values.put("user_tel",tel);
                db.insert("user_info",null,values);
                //执行成功之后调用提示方法,提示注册成功
                success();
    }
    private void repetitionTip() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("该用户名已被注册,请点击确定按钮返回登录!")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                })
                .show();
    }
    //注册成功提示方法
    private void success() {
        new AlertDialog.Builder(this)
                .setTitle("恭喜")
                .setMessage("注册成功,点击确定按钮返回登录!")
                //第一个参数按钮上显示的文字;第二个参数按钮的点击事件;
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //让它结束掉本活动,回到上一个活动,即登录页面
                        finish();
                    }
                })
                .show();
    }
    //密码不一致提示
    private void disLikeTip() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("两次输入的密码不一致!")
                .setPositiveButton("确定",null)
                .show();
    }
    //信息不完整提示
    private void nullTip() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("请把注册信息填写完整哦!")
                .setPositiveButton("确定",null)
                .show();
    }
    //控件实例化方法
    void initID(){
        mInUserName = findViewById(R.id.inUserName);
        mInUserPass = findViewById(R.id.inUserPass);
        mInPassAgain = findViewById(R.id.inPassAgain);
        mInTel = findViewById(R.id.inTel);
        mButton3 = findViewById(R.id.button3);
    }
}

这样的话注册入库就完成了,看看效果图吧
在这里插入图片描述

在这里插入图片描述

当然点击确定按钮肯定就会返回登录页面喽;

接下来就要写登录的内容了,就要见到我们的查询方法query了,看代码,所有说明在注释;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText mEditText;
    private EditText mEditText2;
    private Button mButton;
    private Button mButton2;
    SQLiteDatabase db2;
    SQLiteOpenHelper sql;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initId();
        //对咋们的数据库类进行实例化;这儿的参数就是咋们留在那边的,删剩下的东西;
        //第一个参数是上下文,第二个数据库文件的名称,第三个工厂号,填null就可以了,最后一个是版本号
        sql = new SQLuse(MainActivity.this,"userInfo.db",null,1);
        //登录按钮和注册按钮的点击监听器,因为方法在下面实现了,所以在这写this
        mButton.setOnClickListener(this);
        mButton2.setOnClickListener(this);
    }
    //控件实例化的方法
    void initId(){
        mEditText = findViewById(R.id.editText);
        mEditText2 = findViewById(R.id.editText2);
        mButton = findViewById(R.id.button);
        mButton2 = findViewById(R.id.button2);
    }
    //按钮的点击事件,即上文 mButton.setOnClickListener(this)中的this,指的就是他了
    @Override
    public void onClick(View v) {
        //这儿用switch进行判断
        switch (v.getId()){
            //如果点击的是登录按钮,就调用getStata方法,看是否填写了登录信息
            case R.id.button:
                getStata();
                break;
                //如果点击的是注册按钮,直接跳转到注册页面
            case R.id.button2:
                startActivity(new Intent(MainActivity.this,Main2Activity.class));
                break;
        }
    }
    //判断是否填写了登录信息
    private void getStata() {
        initId();
        String edname = mEditText.getText().toString();
        String edPsd = mEditText2.getText().toString();
        //如果有一个为空则调用nullTip方法,弹出登录信息不能为空提示窗
        if (edname.equals("") || edPsd.equals("")){
            nullTip();
        }else {
            //否则调用queryUserinfo方法,进行对表,看输入的信息与库中是否一直
           queryUserinfo(edname,edPsd);
        }
    }
    //查询对表方法
    private void queryUserinfo(String name,String psd) {
        //对SQLiteDatabase进行实例化;
        db2 = sql.getReadableDatabase();
        /*开始查询,第一个参数表名称,第二个参数要查询的列,或者说要查什么;
        第三个参数用什么查?第四个参数上一个参数占位符的值,即“什么”的值,
        我这儿写的意思是查询user_info这个表,这个表里的user_password即存密码的这一列,看看user_name所对应的user_password是什么。
        然后动态把user_name传进去,这儿传的是用户请求登录的用户名;即看这个用户名的密码是什么。
         */
        Cursor cursor = db2.query("user_info",new String[]{"user_password"}, "user_name= ?",new String[]{name},null,null,null);
        //遍历cursor游标集,
        while (cursor.moveToNext()){
            //取出用户名所对应的密码
            String psdquery = cursor.getString(cursor.getColumnIndex("user_password"));
            //判断用户输入的密码和库中该用户名对应的密码是否一致
            if (psd.equals(psdquery)){
                //如果一致,跳转进入到主页面
                startActivity(new Intent(MainActivity.this,Main3Activity.class));
            }else {
                //否则调用psdErr方法,给出错误提示
                psdErr();
            }
        }
    }
//输入为空提示
    private void nullTip() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("请输入用户名或密码!")
                .setPositiveButton("确定",null)
                .show();
    }
//密码错误提示    
    private void psdErr() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("用户名或密码错误!")
                .setPositiveButton("确定",null)
                .show();
    }
}

还是这样,东西虽然多 但很多是重复的,还有很多很多我的注释喽;

好了以上就是实现的功能和SQLite实现的步骤,可供大家参考,不是太完善,大家有需要可以自己改,

最后在说一下没用到的两个方法,把query方法再理一下:

(1)insert方法,即增加数据的方法;三个参数;第一个是表名,第二个表示当存入的数据为空时显示存入的值,可以为null、没有数据、存了个空数据等等例如此类的东西,第三个是真正要存入的值,通过键值对进行存储。
语法如下:

ContentValues values = new ContentValues();
values.put("user_name",name);
values.put("user_password",psd);
values.put("user_tel",tel);
db.insert("user_info",null,values);

(2)updata方法,更新数据的方法,在本例中可以用做修改密码,第一个参数还是表名;第二个参数要更新的值,也是用键值对的方式传进去,跟上边一样;第三个值为条件语句,即改哪一条的数据,可以使用占位符?,最后一个参数是上一个占位符的值;比如:

ContentValues values1 = new ContentValues();
values1.put("user_password","新密码");
/*我这儿的意思就是更改名字为第三个参数name的用户的密码,
表名是第一个参数;第二个参数是用户名是什么?第三个参数给
了它用户名,让他知道去改哪一个用户的密码
*/	
db.update("user_info",values,"user_name = ?",new String[]{name});

(3)delete方法,删除数据的方法,在本例中可以是用户注销账户。第一个参数当然还是表名,第二个参数用于指定条件语句,可以使用占位符?,意思就是删除哪一条数据,具条删哪一条就是最后第三个参数给出的值;这个就比较简单,比如:

db.delete("user_info","user_name = ?",new String[]{name});

(4)query方法,查询方法;我这儿介绍参数最少的一个,7个参数的。毫无疑问,第一个参数是表名;第二个参数是要查询的列,为空返回所有列;第三个参数是查询的条件,可以使用占位符?,代码注释应该够明了,第四个参数占位符的值,第五个参数指定分组方式,第六个指定having的条件;第七个排序方式,顺序asc,倒序desc;

我自己踩过的坑:第二个参数可以是查询多个列,但第二个参数和第三个参数一定不能重复,不然老是查询不到

/*开始查询,第一个参数表名称,第二个参数要查询的列,或者说要查什么;
第三个参数用什么查?第四个参数上一个参数占位符的值,即“什么”的值,
我这儿写的意思是查询user_info这个表,这个表里的user_password即存密码的这一列,看看user_name所对应的user_password是什么。
然后动态把user_name传进去,这儿传的是用户请求登录的用户名;即看这个用户名的密码是什么。
 */
Cursor cursor = db2.query("user_info",new String[]{"user_password"}, "user_name= ?",new String[]{name},null,null,null);
//遍历cursor游标集,
while (cursor.moveToNext()){
    //取出用户名所对应的密码
    String psdquery = cursor.getString(cursor.getColumnIndex("user_password"));
    //判断用户输入的密码和库中该用户名对应的密码是否一致
    if (psd.equals(psdquery)){
        //如果一致,跳转进入到主页面
        startActivity(new Intent(MainActivity.this,Main3Activity.class));
    }else {
        //否则调用psdErr方法,给出错误提示
        psdErr();
    }

这儿我觉的还有一个比较实用的方法:limit方法,限制返回的记录条数。

终于写完了,这就是数据库操作啦,我觉的写的够详细了,但还是不免会有漏掉的,如果有大家可以自己查哦,或者问我也行。其实也就一点点东西,感觉我自己就是学完这一部分才开是有逻辑的,嘿嘿嘿,加油哦,祝学习进步。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

户伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值