1. 程式人生 > >Android Sqlite資料庫常用操作

Android Sqlite資料庫常用操作

很久前也寫過一篇Android資料庫操作相關內容。在正式專案中,我們通常會使用資料庫開源框架如GreenDao來對資料庫進行操作。
感覺很久沒有直接使用Sql語句了,這幾天有時間,就溫習了下相關知識。
SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統.是開源的,高效率的,可嵌入且程式驅動的資料庫。
使用起來非常方便,因為其API簡單易用,程式碼量少。
1,資料型別有:
1).  NULL,值是NULL
2).  INTEGER,值是有符號整形,根據值的大小以1,2,3,4,6或8位元組存放
3).  REAL,值是浮點型值,以8位元組IEEE浮點數存放
4).  TEXT,值是文字字串,使用資料庫編碼(UTF-8,UTF-16BE或者UTF-16LE)存放
5).  BLOB,只是一個數據塊,完全按照輸入存放(即沒有準換)
實際也支援我們覺的Integer,varchar,time,double等型別。
在使用資料庫時,我們通常要使用到的sql語句有:
1,建立表
create
table 表名(欄位名稱 資料型別 約束,欄位名稱 資料型別 約束......) 例如建立一個學生表student: create table student(_id Integer primary key,name varchar(10) not null,age Integer,scroe float) 2,刪除表 drop table 表名 例如刪除剛剛建立的student表: drop table student 3,表中新增(插入資料) insert into 表名(欄位1,欄位2...)values (值1,值2...) 或者: insert into 表名 values(值1,值2.
..值n) 這種方式新增資料要求後面的值與資料表中欄位一一對應且不能空缺欄位 例如給student表中新增一條資料: insert into student (_id,name,age,scroe) values(1,'張三',13,85.6) 4,表中刪除資料 delete from 表名 where 刪除的條件 比如刪除student表中姓名為張三的資料: delete from student where name="張三" 5,修改表中的資料 update 表名 set 欄位=新值 where 修改的條件 例如,修改student表中張三的成績為90update student set
score=90 where _id=1 6,查詢表中的資料 1,查詢全部資料 select * from 表名 例如查的student表中所有資料: select * from student 2,查詢指定資料: select 欄位名 from 表名 where 查詢條件 group by 分組欄位 having 篩選條件 order by 排序欄位 例如查詢學生表student中姓名為張三的成績: select scroe from student where name='張三'

簡單例子:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button db_create;
    private Button table_insert;
    private Button table_query;
    private Button table_delete;
    private Button table_update;
    private TextView show_tv;
    //判斷是否已經建立資料庫
    private boolean isCreateDb = false;
    private DBManager mDbManager;
    private MyDBHelper mDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDbManager = DBManager.getInstance(this);
        //執行這句程式碼就可以建立資料庫及表資訊
        mDbHelper = new MyDBHelper(this);
        initViews();
    }

    /**
     * @param
     * @description 初始化UI及監聽事件
     * @author ldm
     * @time 2016/11/10 9:47
     */
    private void initViews() {
        this.db_create = (Button) findViewById(R.id.db_create);
        this.table_insert = (Button) findViewById(R.id.table_insert);
        this.table_query = (Button) findViewById(R.id.table_query);
        this.table_delete = (Button) findViewById(R.id.table_delete);
        this.table_update = (Button) findViewById(R.id.table_update);
        this.show_tv = (TextView) findViewById(R.id.show_tv);
        this.db_create.setOnClickListener(this);
        this.table_insert.setOnClickListener(this);
        this.table_query.setOnClickListener(this);
        this.table_delete.setOnClickListener(this);
        this.table_update.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.db_create://建立資料庫(表)
                //呼叫mDbManager.getDBHelper(),
                if (mDbHelper == null) {
                    mDbHelper = new MyDBHelper(this);
                }
                isCreateDb = true;
                //每次操作後,查詢資料庫顯示結果
                queryAndShow();
                break;
            case R.id.table_insert://表中插入資料
                if (!isCreateDb) {
                    Toast.makeText(this, "請先點選按鈕建立資料庫相關資訊", Toast.LENGTH_SHORT).show();
                    return;
                }
                //先插入6條資料
                String sql0 = "insert into " + MyDBHelper.T_NAME + " values(1,'趙一',14,99)";
                String sql4 = "insert into " + MyDBHelper.T_NAME + " values(2,'吳二',15,67.5)";
                String sql = "insert into " + MyDBHelper.T_NAME + " values(3,'李四',14,59)";
                String sql1 = "insert into " + MyDBHelper.T_NAME + " values(4,'王五',15,80)";
                String sql2 = "insert into " + MyDBHelper.T_NAME + " values(5,'陳六',16,77.5)";
                String sql3 = "insert into " + MyDBHelper.T_NAME + " values(6,'劉大',15,83.4)";
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql0);
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql4);
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql);
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql1);
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql2);
                mDbManager.execSql(mDbHelper.getWritableDatabase(), sql3);
                //每次操作後,查詢資料庫顯示結果
                queryAndShow();
                break;
            case R.id.table_query://查詢表中資料
                if (!isCreateDb) {
                    Toast.makeText(this, "請先點選按鈕建立資料庫相關資訊", Toast.LENGTH_SHORT).show();
                    return;
                }
                //每次操作後,查詢資料庫顯示結果
                queryAndShow();
                break;
            case R.id.table_delete://刪除表中資料
                if (!isCreateDb) {
                    Toast.makeText(this, "請先點選按鈕建立資料庫相關資訊", Toast.LENGTH_SHORT).show();
                    return;
                }
                String delSql = "delete from " + MyDBHelper.T_NAME + " where " + MyDBHelper.TABLE_ID + "=3";
                mDbManager.execSql(mDbHelper.getWritableDatabase(), delSql);
                //每次操作後,查詢資料庫顯示結果
                queryAndShow();
                break;
            case R.id.table_update://修改表中資料
                if (!isCreateDb) {
                    Toast.makeText(this, "請先點選按鈕建立資料庫相關資訊", Toast.LENGTH_SHORT).show();
                    return;
                }
                String updSql = "update " + MyDBHelper.T_NAME + " set " + MyDBHelper.TABLE_NAME + "='李九'" + " where " + MyDBHelper.TABLE_ID + "=5";
                mDbManager.execSql(mDbHelper.getWritableDatabase(), updSql);
                //每次操作後,查詢資料庫顯示結果
                queryAndShow();
                break;
        }
    }

    /**
     * @param
     * @description 查詢資料並顯示資料內容
     * @author ldm
     * @time 2016/11/10 10:18
     */
    private void queryAndShow() {
        String sql = "select * from " + MyDBHelper.T_NAME;
        StringBuffer sb = new StringBuffer();
        Cursor cursor = mDbHelper.getWritableDatabase().rawQuery(sql, null);
        while (cursor.moveToNext()) {
            sb.append("_id=").append(cursor.getString(cursor.getColumnIndex(MyDBHelper.TABLE_ID))).append(" ")
                    .append("name=").append(cursor.getString(cursor.getColumnIndex(MyDBHelper.TABLE_NAME))).append(" ")
                    .append("age=").append(cursor.getInt(cursor.getColumnIndex(MyDBHelper.TABLE_AGE))).append(" ")
                    .append("score=").append(cursor.getInt(cursor.getColumnIndex(MyDBHelper.TABLE_SCORE)))
                    .append("\n");
        }
        show_tv.setText("查詢結果是:\n" + sb.toString());
    }
/*--除了用基礎的Sql語句操作資料外,還可以直接使用Android提示的資料庫操作方法,網上資料很多,就不記錄啦---**/
}

資料庫操作類:SQLiteOpenHelper

public class MyDBHelper extends SQLiteOpenHelper {
    private final static String DB_NAME = "test";
    private final static int DB_VERSION = 1;
    public final static String T_NAME = "student";
    public final static String TABLE_ID = "_id";
    public final static String TABLE_NAME = "name";
    public final static String TABLE_AGE = "age";
    public final static String TABLE_SCORE = "score";

    public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //定義引數簡單地構造方法
    public MyDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    //資料庫建立時呼叫
    @Override
    public void onCreate(SQLiteDatabase db) {
        //如果寫有建立表的Sql語句時,就會在建立資料的時候建立對應的表格
        String sql = "create table " + T_NAME + "("
                + TABLE_ID + " Integer primary key,"
                + TABLE_NAME + " varchar(10),"
                + TABLE_AGE + " Integer,"
                + TABLE_SCORE + " float"
                + ")";
        //執行建立表格語句
        db.execSQL(sql);
    }

    //資料庫版本發生更新時呼叫
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //更新資料庫
    }

    //開啟資料庫時呼叫
    @Override
    public void onOpen(SQLiteDatabase db) {
        //如果資料庫已經存在,則再次執行不執行onCreate()方法,而是執行onOpen()開啟資料庫
        super.onOpen(db);
    }
}

實際 專案中應該把資料庫操作方法統一封裝一下:

public class DBManager {
    private static DBManager dbManager;
    private Context context;

    private DBManager(Context context) {
        this.context = context;
    }

    public static DBManager getInstance(Context context) {
        if (null == dbManager) {
            dbManager = new DBManager(context);
        }
        return dbManager;
    }

    /**
     * @param
     * @description 通過執行sql語句來操作資料庫
     * @author ldm
     * @time 2016/11/10 9:25
     */
    public void execSql(SQLiteDatabase db, String sql) {
        if (null != db && !TextUtils.isEmpty(sql)) {
            db.execSQL(sql);
        }
        db.close();
    }
}

主介面佈局檔案:

<?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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ldm.androiddb.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sqlite資料庫操作" />

    <Button
        android:id="@+id/db_create"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="建立資料庫"
        android:textSize="16sp" />

    <Button
        android:id="@+id/table_insert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="表中插入資料"
        android:textSize="16sp" />

    <Button
        android:id="@+id/table_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="查詢表中資料"
        android:textSize="16sp" />

    <Button
        android:id="@+id/table_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="刪除表中資料"
        android:textSize="16sp" />

    <Button
        android:id="@+id/table_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="修改表中資料"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/show_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textSize="15sp"
        android:textColor="@android:color/holo_blue_bright"/>
</LinearLayout>

新增許可權 :

 <!-- 在SDCard中建立與刪除檔案許可權 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard寫入資料許可權 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

效果貼圖:
這裡寫圖片描述