Android 中關於增刪改查資料庫表實踐

Joerrot發表於2018-09-02

activity_main.xml: 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"/>
    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="add data"/>
    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="delete data"/>
    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="update data"/>
    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="query data"/>

</LinearLayout>

 

package com.activitytest.databasetest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
 * SQLiteOpenHelper是抽象類,必須繼承它才能使用
 *  SQLite最大的特點是你可以儲存任何型別的資料到任何欄位中,無論這列宣告的資料型別是什麼。
 *  例如:可以在Integer型別的欄位中存放字串,或者在布林型欄位中存放浮點數,或者在字元型欄位中存放日期型值。
 *  但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能儲存64位整數,當向這種欄位中儲存除整數以外的資料時,將會產生錯誤。
 *   另外, SQLite 在解析create table 語句時,會忽略 create table 語句中跟在欄位名後面的資料型別資訊
 * Created by 陳偉欽 on 2018/9/1.
 */

public class MyDatabaseHelper extends SQLiteOpenHelper {
    //把建立資料庫表語句等同於字串變數的值,宣告為static使得其隨著類的載入而存在,隨著類的消失而消失,
    //在類第一次被使用時裝載 ,只分配一塊儲存空間,所有此類的物件都可以操控此塊不變的儲存空間
    public final static String CREATE_BOOK = "create table Book("+
            "id integer primary key autoincrement,"+
            "author text,"+
            "price real,"+
            "pages integer,"+
            "name text)";
    public final static String CREATE_CATEGORY = "create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";
    private Context context;
    //第二個引數為資料庫名字(.db),第三個引數一般傳入null,第四個引數是當前資料庫的版本號
    public MyDatabaseHelper(Context mcontext, String name, SQLiteDatabase.CursorFactory cursorFactory, int version){
        super(mcontext,name,cursorFactory,version);
        context = mcontext;
    }
    //當呼叫SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於運算元據庫的SQLiteDatabase例項的時候,
    // 如果資料庫不存在,Android系統會自動生成一個資料庫,接著呼叫onCreate()方法,onCreate()方法在初次生成資料庫時才會被呼叫,
    // 在onCreate()方法裡可以生成資料庫表結構及新增一些應用使用到的初始化資料。
    @Override
    public void onCreate(SQLiteDatabase db) {
        //使用資料庫的execSQL方法,可以以資料庫語言(字串形式)作為引數
        db.execSQL(CREATE_BOOK); //執行建表語句,建立資料庫表
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(context, "Create databases succeed", Toast.LENGTH_SHORT).show();
    }
    //onUpgrade()方法在資料庫的版本發生變化時會被呼叫,一般在軟體升級時才需改變版本號,
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //這裡onUpgrade()方法在資料庫版本每次發生變化時都會把使用者手機上的資料庫表刪除,然後再重新建立。
        // 一般在實際專案中是不能這樣做的,正確的做法是在更新資料庫表結構時,還要考慮使用者存放於資料庫中的資料不會丟失。
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}
package com.activitytest.databasetest;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;

/**
 * 呼叫SQLiteDatabase物件的一些方法可以實現資料庫表的增刪改查
 */

public class MainActivity extends Activity implements View.OnClickListener{
    private MyDatabaseHelper dbhelper;
    private Button btn1;
    private Button btn2;
    private Button btn3;
    private Button btn4;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        dbhelper = new MyDatabaseHelper(this,"BookStore.db",null, 2);

    }
    @Override
    public void onClick(View v) {
        ContentValues values = new ContentValues();
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        switch(v.getId()){
            case R.id.create_database:
                dbhelper.getWritableDatabase();
            case R.id.add_data:
                values.put("name","The Da Vinci Code");
                values.put("author","Dan Brown");
                values.put("pages",454);
                values.put("price",16.96);
                db.insert("Book",null,values);
                values.clear();
                //組裝第二條資料
//                values.put("name","The Lost Symbol");
//                values.put("author","Dan Brown");
//                values.put("pages",510);
//                values.put("price",19.95);
//                db.insert("Book",null,values);
                db.execSQL("insert into Book(name, author, pages, price) values(?,?,?,?)",new String[]{"The Lost Symbol","Dan Brown","510","19.95"});
            case R.id.update_data:
//                values.put("price",10.99);
//                db.update("Book",values,"name= ?",new String[]{"The Da Vinci Code"});
                db.execSQL("update Book set price = ? where name = ?",new String[]{"10.99","The Da Vinci Code"});
            case R.id.delete_data:
                //db.delete("Book","pages > ?",new String[]{"500"});
                db.execSQL("delete from Book where pages > ?", new String[]{"500"});
            case R.id.query_data:
                //呼叫query()方法會返回一個Cursor物件,利用此物件可以取出資料
                //Cursor物件是行的集合
//                Cursor cursor = db.query("Book",null,null,null,null,null,null);
//                if(cursor.moveToFirst()){
//                    do{
//                        //利用getColumnIndex()方法可以獲得當前行的列名為name的值
//                        String name = cursor.getString(cursor.getColumnIndex("name"));
//                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
//                        String author = cursor.getString(cursor.getColumnIndex("author"));
//                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
////                        Toast.makeText().show();
//                    }while(cursor.moveToNext());
//                }
//                cursor.close();
                db.rawQuery("select * from Book",null);
        }
        //getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用於運算元據庫的SQLiteDatabase例項。
        // 但getWritableDatabase() 方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫。
        // 倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式開啟資料庫,
        // 如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以只讀方式開啟資料庫。
        //如果資料庫不存在,Android系統會自動生成一個資料庫,接著呼叫onCreate()方法。
        // onCreate()方法在初次生成資料庫時才會被呼叫,在onCreate()方法裡可以生成資料庫表結構及新增一些應用使用到的初始化資料。
    }

    private void init(){
        btn1 = (Button) findViewById(R.id.create_database);
        btn2 = (Button) findViewById(R.id.add_data);
        btn3 = (Button) findViewById(R.id.delete_data);
        btn4 = (Button) findViewById(R.id.update_data);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
    }
}

 

相關文章