Android中操作数据库SQL语句的讲解,简单的查询修改等操作学生类的例子讲解

先要了解一个SQliteOpenHelper的类
在这里插入图片描述
还有一个 SQliteDatabase类
在这里插入图片描述
其中的两个方法为
在这里插入图片描述
当我们用到 select*from时 使用的是rawQuery()方法
当我们要创建表的时间,我们用的是execSQL()方法

一.创建页面
开始创建我们学生类,以简单的例子来演示安卓中操作SQL语句
创建我们的主页面为

<EditText
    android:id="@+id/name_edt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/name" />


<EditText
    android:id="@+id/age_edt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:hint="@string/age" />





<RadioGroup
    android:id="@+id/gender_gp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="性别:"
        android:layout_marginLeft="5dp"
        android:layout_marginStart="5dp" />
    <RadioButton
        android:id="@+id/male"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="男"
        android:checked="true"
        android:layout_marginLeft="15dp"
        android:layout_marginStart="15dp" />
    <RadioButton
        android:id="@+id/female"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RadioGroup>
<EditText
    android:id="@+id/id_edt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="编号"
    />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button
        android:id="@+id/insert_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="添加"
        android:onClick="operate"/>

    <Button
        android:id="@+id/select_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="查询"
        android:onClick="operate"/>

    <Button
        android:id="@+id/delete_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="删除"
        android:onClick="operate"/>
    <Button
        android:id="@+id/update_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="修改"
        android:onClick="operate"/>
</LinearLayout>
<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/stu_list">

</ListView>
</LinearLayout>

视图的效果为
在这里插入图片描述
再写一个listview来使得学生信息能在下面的空白处显示出来代码为

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/id_item"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/name_item"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/age_item"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/gender_item"/>

</LinearLayout>

二:编写代码
主代码为

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

private EditText nameEdt , ageEdt , idEdt;
private ListView stuList;
private RadioButton malerb;
private String genderStr = "男";
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //添加操作
    //数据库名称
    //如果只有一个数据库名称,那么这个数据库的位置会是在私有目录中
    //如果带SD卡路径,那么数据库位置则在指定的路径下
    String path = Environment.getExternalStorageDirectory() + "/stu.db";
    SQLiteOpenHelper helper = new SQLiteOpenHelper(this,path,null,2) {
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            //创建
            Toast.makeText(MainActivity.this,"数据库创建",Toast.LENGTH_SHORT).show();
            //如果数据库不存在,则会调用onCreate方法,那么我们可以将表的创建工作放在这里面完成
                    /*
                    String sql = "create table test_tb (_id integer primary key autoincrement," +
                            "name varhcar(20)," +
                            "age integer)";
                    sqLiteDatabase.execSQL(sql);*/
        }

        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            //升级
            Toast.makeText(MainActivity.this,"数据库升级",Toast.LENGTH_SHORT).show();
        }
    };

    //用于获取数据库库对象
    //1.数据库存在,则直接打开数据库
    //2.数据库不存在,则调用创建数据库的方法,再打开数据库
    //3.数据库存在,但版本号升高了,则调用数据库升级方法
    db = helper.getReadableDatabase();

    nameEdt = findViewById(R.id.name_edt);
    ageEdt = findViewById(R.id.age_edt);
    idEdt = findViewById(R.id.id_edt);
    malerb = findViewById(R.id.male);

    RadioGroup genderGp = findViewById(R.id.gender_gp);
    genderGp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            if(i == R.id.male){
                //“男”
                genderStr = "男";
            }else{
                //"女"
                genderStr = "女";
            }
        }
    });

    stuList = findViewById(R.id.stu_list);
}

//    SQLiteOpenHelper
//    SQLiteDatabase
public void operate(View v){

    String nameStr = nameEdt.getText().toString();
    String ageStr = ageEdt.getText().toString();
    String idStr = idEdt.getText().toString();
    switch (v.getId()){
        case R.id.insert_btn:


//                db.rawQuery();        查询    select * from 表名
//                db.execSQL();         添加、删除、修改、创建表

            //String sql = "insert into info_tb (name,age,gender) values ('"+nameStr+"',"+ageStr+",'"+genderStr+"')";
            String sql = "insert into info_tb (name,age,gender) values (?,?,?)";
            db.execSQL(sql,new String[]{nameStr,ageStr,genderStr});
            Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
            break;
        case R.id.select_btn:
            //SQLiteOpenHelper
            //select * from 表名 where _id = ?
            String sql2 = "select * from info_tb";
            if(!idStr.equals("")){
                sql2 += " where _id=" + idStr;
            }
            //查询结果
            Cursor c = db.rawQuery(sql2,null);

            //SimpleCursorAdapter
            //SimpleAdapter a = new SimpleAdapter()
            //参数3:数据源
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                    this, R.layout.item,c,
                    new String[]{"_id","name","age","gender"},
                    new int[]{R.id.id_item,R.id.name_item,R.id.age_item,R.id.gender_item},
                    CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

            stuList.setAdapter(adapter);
            break;
        case R.id.delete_btn:
            //' '   "23"   23
            String sql3 = "delete from info_tb where _id=?";
            db.execSQL(sql3,new String[]{idStr});
            Toast.makeText(this,"删除成功",Toast.LENGTH_SHORT).show();
            break;
        case R.id.update_btn:
            String sql4 = "update info_tb set name=? , age=? , gender=?  where _id=?";
            db.execSQL(sql4,new String[]{nameStr,ageStr,genderStr,idStr});
            Toast.makeText(this,"修改成功",Toast.LENGTH_SHORT).show();
            break;
    }
    nameEdt.setText("");
    ageEdt.setText("");
    idEdt.setText("");
    malerb.setChecked(true);
}
}

解析:
代码中的path路径是上一篇文章以及创建好的文件
1:这一部分是创建的SQLiteOpenHelper类,以及里边的两个自带生成的方法,四个参数为
第一个是环境上下文,第二个是创建文件的位置,第三个为null,第四个是这个等级,如过不是1的话就是升级。最后一行的代码是我们必须写的作用在上方的主要代码中可以看到。

	SQLiteOpenHelper helper = new SQLiteOpenHelper(this,path,null,2) {
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            //创建
            Toast.makeText(MainActivity.this,"数据库创建",Toast.LENGTH_SHORT).show();
            //如果数据库不存在,则会调用onCreate方法,那么我们可以将表的创建工作放在这里面完成
                    /*
                    String sql = "create table test_tb (_id integer primary key autoincrement," +
                            "name varhcar(20)," +
                            "age integer)";
                    sqLiteDatabase.execSQL(sql);*/
        }

        @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        //升级
        Toast.makeText(MainActivity.this,"数据库升级",Toast.LENGTH_SHORT).show();
    }
};
helper.getReadableDatabase();

2:
这里是用的是SQLitedatabase里边的创建表格的方法,但是在上边我们用的是已经创建好的路径path,所以不用这个方法

 /*
                    String sql = "create table test_tb (_id integer primary key autoincrement," +
                            "name varhcar(20)," +
                            "age integer)";
                    sqLiteDatabase.execSQL(sql);*/

3:这个地方我们监视的是获得性别的控件,一旦选择我们就获得他们的id

    RadioGroup genderGp = findViewById(R.id.gender_gp);
    genderGp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            if(i == R.id.male){
                //“男”
                genderStr = "男";
            }else{
                //"女"
                genderStr = "女";
            }
        }
    });

前边的

	 private String genderStr = "男";

是为了防止你什么也不选,所以就默认为男性。
下面的代码是监听你的姓名,年龄以及学号id的代码。

String nameStr = nameEdt.getText().toString();
String ageStr = ageEdt.getText().toString();
String idStr = idEdt.getText().toString();

4:查询的解释

case R.id.select_btn:
        //SQLiteOpenHelper
        //select * from 表名 where _id = ?
        String sql2 = "select * from info_tb";
        if(!idStr.equals("")){
            sql2 += " where _id=" + idStr;
        }
        //查询结果
        Cursor c = db.rawQuery(sql2,null);

        //SimpleCursorAdapter
        //SimpleAdapter a = new SimpleAdapter()
        //参数3:数据源
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                this, R.layout.item,c,
                new String[]{"_id","name","age","gender"},
                new int[]{R.id.id_item,R.id.name_item,R.id.age_item,R.id.gender_item},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        stuList.setAdapter(adapter);
        break;

因为这里要用到listview,所以少不了适配器的使用,用的是SimpleCursorAdapter适配器,这里的参数都不能少,记住Cursor使用在适配器中即可。

最后的操作是把我们搜查后的内容给清空,便于下一次搜查。
如此便完成了我们的简单例子
在这里插入图片描述
简单易懂!!!

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页