1. 程式人生 > >Android-Sqlite-OOP方式操作增刪改查

Android-Sqlite-OOP方式操作增刪改查

之前寫的資料庫增刪改查,是使用SQL語句來實現的,Google 就為Android開發人員考慮,就算不會SQL語句也能實現增刪改查,所以就有了OOP面向物件的增刪改查方式

其實這種OOP面向物件的增刪改查方式,最後系統會自動拼接成SQL語句,然後交給Sqlite.c執行,當然這種OOP面向物件的增刪改查有點是,很難寫錯

 

資料庫幫助類:

package liudeli.datastorage.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteOpenHelper; public class MySQLiteOpenHelper extends SQLiteOpenHelper { public static MySQLiteOpenHelper mySQLiteOpenHelper; /** * 由於表名每次使用很頻繁,所有定義成常量 */ public static final String TABLE_NAME = "student_table"; private static final String DB_NAME = "person_info.db";
private static final int VERSION = 2; public synchronized static MySQLiteOpenHelper getInstance(Context context) { if (null == mySQLiteOpenHelper) { mySQLiteOpenHelper = new MySQLiteOpenHelper(context, DB_NAME, null, VERSION); } return mySQLiteOpenHelper; }
/** * 當開發者呼叫 getReadableDatabase(); 或者 getWritableDatabase(); * 就會通過此構造方法配置的資訊 來建立 person_info.db 資料庫 * 此方法的另外作用是,如果存著資料庫就開啟資料庫,不存著資料庫就建立資料庫 * @param context 上下文 * @param name 資料庫名 * @param factory 遊標工廠 * @param version 版本,最低為1 */ private MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 此方法是何時呼叫? ,是需要開發者呼叫 getReadableDatabase(); 或者 getWritableDatabase(); * 此方法的作用是,如果沒有表就建立開啟,如果有表就開啟 * @param db 可執行SQL語句 */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table "+TABLE_NAME+"(_id integer primary key autoincrement, name text, age integer);"); } /** * 此方法用於資料庫升級 * @param db 可執行SQL語句 * @param oldVersion 以前舊版本的版本號 * @param newVersion 現在目前最新的版本號 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table "+TABLE_NAME+" add sex text null"); } }

 

MainActivity OOP面向物件方式操作 增刪改查:

package liudeli.datastorage;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import liudeli.datastorage.db.MySQLiteOpenHelper;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private final String TAG = MainActivity.class.getSimpleName();

    private MySQLiteOpenHelper mySQLiteOpenHelper;

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


        mySQLiteOpenHelper = MySQLiteOpenHelper.getInstance(this);

        // person_info.db建立成功  table表建立成功  還有一個很重要的作用:重新整理資料庫 重新整理表資料等
        mySQLiteOpenHelper.getReadableDatabase();
        mySQLiteOpenHelper.getWritableDatabase();

        initViewListener();
    }

    private void initViewListener() {
        Button btQuery = findViewById(R.id.bt_query);
        Button btInsert = findViewById(R.id.bt_insert);
        Button btUpdate = findViewById(R.id.bt_update);
        Button btDelete = findViewById(R.id.bt_delete);

        btQuery.setOnClickListener(this);
        btInsert.setOnClickListener(this);
        btUpdate.setOnClickListener(this);
        btDelete.setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();

    }

    /**
     * 雖然之需要一次 getWritableDatabase getReadableDatabase 就可以來,為什麼還需要每次點選都執行一次?
     * 答:getWritableDatabase getReadableDatabase 還有一個很重要的作用:重新整理資料庫 重新整理表資料等
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_query: {
                SQLiteDatabase db = mySQLiteOpenHelper.getReadableDatabase();
                // SQL語句的方式
                // Cursor cursor = db.rawQuery("select * from "+MySQLiteOpenHelper.TABLE_NAME+";", null);

                // OOP面向物件的方式 帶條件查詢
                /*Cursor cursor = db.query(MySQLiteOpenHelper.TABLE_NAME,
                                        new String[]{"_id", "name", "age"},
                                        "_id = ?",
                                        new String[]{"10"},
                                        null,
                                        null,
                                        "_id desc");*/

                // OOP面向物件的方式 全部查詢
                Cursor cursor = db.query(MySQLiteOpenHelper.TABLE_NAME,
                                new String[]{"*"},
                                null,
                                null,
                                null,
                                null,
                                null);

                while (cursor.moveToNext()) {
                    int _id = cursor.getInt(cursor.getColumnIndex("_id"));
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    int age = cursor.getInt(cursor.getColumnIndex("age"));
                    Log.d(TAG, "_id:" + _id + " name:" + name + " age:" + age);
                }
                db.close();
                break;
            }
            case R.id.bt_insert: {
                SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase();
                // SQL語句的方式
                db.execSQL("insert into " + MySQLiteOpenHelper.TABLE_NAME + "(name,age) values('劉德利',19);");

                // OOP面向物件的方式
                ContentValues contentValues = new ContentValues();
                contentValues.put("name", "張三");
                contentValues.put("age", 19);
                long result = db.insert(MySQLiteOpenHelper.TABLE_NAME, null, contentValues);
                // 受影響行數大於0就是成功了
                if (result > 0) {
                    alterUser("新增成功");
                }
                db.close();
                break;
            }
            case R.id.bt_update: {
                SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase();
                // SQL語句的方式
                // db.execSQL("update student_table set name='德利' where _id = 1;");

                // OOP面向物件的方式
                ContentValues contentValues = new ContentValues();
                contentValues.put("name", "張三四五");
                contentValues.put("age", 100);
                int result = db.update(MySQLiteOpenHelper.TABLE_NAME, contentValues, "_id=?", new String[]{"5"});
                // 受影響行數大於0就是成功了
                if (result > 0) {
                    alterUser("修改成功");
                }
                db.close();
                break;
            }
            case R.id.bt_delete: {
                SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase();
                // SQL語句的方式
                // db.execSQL("delete from student_table where _id = 1;");

                // OOP面向物件的方式
                int result = db.delete(MySQLiteOpenHelper.TABLE_NAME, "_id=?", new String[]{"6"});
                // 受影響行數大於0就是成功了
                if (result > 0) {
                    alterUser("刪除成功");
                }
                db.close();
                break;
            }
            default:
                break;
        }
    }

    private void alterUser(String text) {
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    }
}

 

佈局程式碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

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

    <Button
        android:id="@+id/bt_insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="插入"
        />

    <Button
        android:id="@+id/bt_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改"
        />

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


</LinearLayout>

 

 增刪改查後的資料: