Android-Sqlite-OOP方式操作增刪改查
阿新 • • 發佈:2018-12-07
之前寫的資料庫增刪改查,是使用SQL語句來實現的,Google 就為Android開發人員考慮,就算不會SQL語句也能實現增刪改查,所以就有了OOP面向物件的增刪改查方式
其實這種OOP面向物件的增刪改查方式,最後系統會自動拼接成SQL語句,然後交給Sqlite.c執行,當然這種OOP面向物件的增刪改查有點是,很難寫錯
資料庫幫助類:
package liudeli.datastorage.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; importandroid.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>
增刪改查後的資料: