1. 程式人生 > >Android資料庫一:sqlite語句增刪改查

Android資料庫一:sqlite語句增刪改查

SQLite資料型別

一般資料採用的固定的靜態資料型別,而SQLite採用的是動態資料型別,會根據存入值自動判斷。SQLite具有以下五種常用的資料型別:
NULL: 這個值為空值;
VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過 4000;
CHAR(n):長度固定為n的字串,n不能超過 254;
INTEGER: 值被標識為整數,依據值的大小可以依次被儲存為1,2,3,4,5,6,7,8;
REAL: 所有值都是浮動的數值,被儲存為8位元組的IEEE浮動標記序號;
TEXT: 值為文字字串,使用資料庫編碼儲存(TUTF-8, UTF-16BE or UTF-16-LE);
BLOB: 值是BLOB資料塊,以輸入的資料格式進行儲存。如何輸入就如何儲存,不改變格式;
DATA :包含了 年份、月份、日期;
TIME: 包含了 小時、分鐘、秒;

SqliteOpenHelper的用法:
該類的方法:
1、getReadableDatabase() 建立或者開啟一個可讀寫的資料庫,如果出現問題(磁碟滿等),則開啟一個只讀的資料庫。
2、getWritableDatabase() 獲得一個可讀寫的資料庫。如果磁碟滿則會拋異常。
3、onCreate(SQLiteDatabase db) 只有第一次建立這個資料庫的時候呼叫。一般在這個方法中建立資料的相應表。
4、onOpen(SQLiteDatabase db) 當每次開啟資料庫的時候都會呼叫。這個方法很少使用
5、onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 當升級資料庫即資料庫的版本號發生改變的時候呼叫,一般如果需要修改表結構就寫在這裡.
//db.execSQL(“alert 表名 add 列名列資料型別”);
6、close() 關閉開啟的所有資料庫物件

使用步驟:

建立SQLiteOpenHelper類的子類MySQLiteOpenHelper 類,實現SQLiteOpenHelper類中的抽象方法onCreate()和onUpgrade();
呼叫 MySQLiteOpenHelper 物件的getWritableDatabase 或 getReadableDatabase方法,獲得SQLiteDatabase 物件;
建立表。
呼叫SQLiteDatabase 物件的execSQL()方法,執行 update,insert,delete操作;呼叫rawQuery()方法執行select查詢操作;
如果執行的是查詢操作,則對返回的Cursor進一步處理。

這裡寫圖片描述

案例

SQLiteOpenHelper

public class MyDBHelper extends SQLiteOpenHelper {

    public MyDBHelper(Context context) {
        super(context, "my.db", null, 1);
    }

    /**
     * 第一次建立資料庫的時候回撥該方法,建立表以及表資料的初始化
     *
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table person(_id integer primary key autoincrement,name text)";
        db.execSQL(sql);

        //可以給表初始化一些資料
        //db.execSQL("insert into person(name) values('小米')");
    }

    /**
     * 資料庫升級的時候回撥該方法
     *
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //給表新增一個欄位
        //db.execSQL("alter table person add age integer");
    }

    /**
     * 資料庫開啟的時候回撥該方法
     *
     * @param db
     */
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }
}

Dao類,增刪改查方法

/**
 * 使用SQL語句增刪改查
 * Created by xiaoyehai on 2017/12/30/030.
 */

public class DataBaseDao {

    private final MyDBHelper mDbHelper;

    public DataBaseDao(Context context) {
        mDbHelper = new MyDBHelper(context);
    }

    /**
     * 插入
     *
     * @param dataBean
     */
    public void insert(DataBean dataBean) {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            db.execSQL("insert into person(name) values(" + "'" + dataBean.getName() + "'" + ")");
            db.close();
        }
    }

    /**
     * 更新
     *
     * @param id
     * @param dataBean
     */
    public void update(int id, DataBean dataBean) {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            db.execSQL("update person set name=? where _id=?", new Object[]{dataBean.getName(), id});
            db.close();
        }
    }

    /**
     * 根據id刪除
     */
    public void delete(int id) {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            db.execSQL("delete from person where _id=?", new Object[]{id});
            db.close();
        }
    }

    /**
     * 刪除所有
     */
    public void deleteAll() {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            db.execSQL("delete from person");
            db.close();
        }
    }


    /**
     * 查詢所有
     */
    public List<DataBean> queryAll() {
        List<DataBean> list = new ArrayList<>();
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            Cursor cursor = db.rawQuery("select * from person", null);

            while (cursor.moveToNext()) {
                //int id = cursor.getInt(0);
                int id = cursor.getInt(cursor.getColumnIndex("_id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                DataBean dataBean = new DataBean(name);
                list.add(dataBean);
            }
            cursor.close();
            db.close();
        }
        return list;
    }

    /**
     * 根據id查詢
     * 有問題
     */
    public List<DataBean> query(int id) {
        List<DataBean> list = new ArrayList<>();
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        if (db.isOpen()) {
            Cursor cursor = db.rawQuery("select * from person where _id=?", new String[]{id + ""});

            while (cursor.moveToNext()) {
                //int id = cursor.getInt(0);
                int _id = cursor.getInt(cursor.getColumnIndex("_id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                DataBean dataBean = new DataBean(name);
                list.add(dataBean);
            }
            cursor.close();
            db.close();
        }
        return list;
    }

Activity程式碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_add;
    private Button btn_delete;
    private Button btn_update;
    private Button btn_query;
    private ListView mListView;
    private DataBaseDao mDataBaseDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        mDataBaseDao = new DataBaseDao(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_add: //新增
                addData();
                break;
            case R.id.btn_delete: //刪除
                deleteData();
                break;
            case R.id.btn_update: //更新
                updateData();
                break;
            case R.id.btn_query: //查詢
                queryData();
                break;
        }
    }

    private void queryData() {
        List<DataBean> list = mDataBaseDao.queryAll(); //查詢全部
        //List<DataBean> list = mDataBaseDao.query(5); //根據id查詢
        MyAdapter myAdapter = new MyAdapter(this, list, R.layout.item);
        mListView.setAdapter(myAdapter);
    }

    private void updateData() {
        DataBean dataBean = new DataBean("肖葉海更新");
        mDataBaseDao.update(6, dataBean);
    }

    private void deleteData() {
        //mDataBaseDao.delete(5); //根據id刪除
        mDataBaseDao.deleteAll(); //刪除所有
    }

    private void addData() {
        for (int i = 0; i < 10; i++) {
            DataBean dataBean = new DataBean("肖葉海" + i);
            mDataBaseDao.insert(dataBean);
        }
    }


    private void initView() {
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);
        mListView = (ListView) findViewById(R.id.listview);

        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }
}

佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.originaldb.MainActivity">

    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新增"/>

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="刪除"/>

    <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新"/>

    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查詢"/>

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

實體類

public class DataBean {

    private String name;

    public DataBean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}