Android中運算元據庫SQL語句的講解,簡單的查詢修改等操作學生類的例子講解

Derrick_itRose發表於2020-10-23

先要了解一個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使用在介面卡中即可。

最後的操作是把我們搜查後的內容給清空,便於下一次搜查。
如此便完成了我們的簡單例子
在這裡插入圖片描述
簡單易懂!!!

相關文章