Android中SQLite使用及DataBase管理

Android中SQLite使用及DataBase管理,在實際項目編碼中,大傢可能經常用到sharepreference和sqlite用於數據存儲,其底層原理都是以文件的形式進行存儲。今天我們就來講講sqlite存儲的使用。使用過數據庫的小夥伴們對sqlite的使用應該能夠很快上手。

在操作sqlite數據庫時,一共用到三個類:SQLiteOpenHelper,SQLiteDatabase,Cursor(結果集)。一共包含五種數據類型:NULL,INTEGER,REAL(浮點數),TEXT(字符串文本)和BLOB(二進制對象),但是在編碼的時候像弱語言,varchar等數據類型也能識別,可能是自動轉換成text數據類型瞭。所以我比較習慣用sql命令來操作,減少瞭很多麻煩。

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by qiang.lin,NULL,INTEGER,REAL(浮點數),TEXT(字符串文本)和BLOB(二進制對象)
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private static final String DATA_NAME = "user.db";
    private static final int VERSION=1;


    public MySQLiteOpenHelper(Context context) {
        super(context, DATA_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE user(id VARCHAR(10) NOT NULL,name VARCHAR(10) NOT NULL, password VARCHAR(10) NOT NULL,PRIMARY KEY(id));";
        db.execSQL(sql);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("----版本迭代的時候會使用", "---");
    }
}

這是一個SQLDataBase的管理類,對操作進行管理。db和cursor要及時關閉,否則會導致內存溢出。我隻寫瞭sql語句的操作,因為我感覺這個比較簡單明瞭,有sql基礎的小夥伴一看便知。

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import example.com.mvpdesign.sqlite.MySQLiteOpenHelper;

/**
 * Created by qiang.lin 
 */
public class DataBaseManager {
    private static final String TAG = DataBaseManager.class.getSimpleName();
    private static DataBaseManager dataBaseManager;
    private MySQLiteOpenHelper mySQLiteOpenHelper;
    private SQLiteDatabase sqLiteDatabase;

    private DataBaseManager(Context context) {
        mySQLiteOpenHelper = new MySQLiteOpenHelper(context.getApplicationContext());
    }

    /**
     * 單例模式
     *
     * @return 對象
     */
    public static DataBaseManager getInstance(Context context) {
        if (dataBaseManager == null) {
            synchronized (DataBaseManager.class) {
                if (dataBaseManager == null) {
                    dataBaseManager = new DataBaseManager(context);
                }
            }
        }
        return dataBaseManager;
    }

    /**
     * 增刪改
     *
     * @param sql
     * @param bindArgs 占位符值
     * @return 成功or失敗
     */
    public boolean executeSQL(String sql, Object[] bindArgs) {
        sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
        try {
            sqLiteDatabase.execSQL(sql, bindArgs);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        } finally {
            sqLiteDatabase.close();
        }
        return true;
    }

    /**
     * cursor是結果集,查詢
     *
     * @param sql
     * @param bindArgs 占位符的值
     */
    public Cursor selectSQL(String sql, String[] bindArgs) {
        sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();
        Cursor cursor = null;
        try {
            cursor = sqLiteDatabase.rawQuery(sql, bindArgs);
            if (cursor != null && cursor.getCount() > 0) {
                return cursor;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        } finally {
            cursor.close();
            sqLiteDatabase.close();
        }
        return null;
    }
}

插入操作

 boolean flag = DataBaseManager.getInstance(SqliteActivity.this).executeSQL("insert into user(id,name,password) values(?,?,?);", new String[]{"1", "李四", "234"});

刪除操作

    boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("delete from user where id=? ", new String[]{"1"});

修改操作

  boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("update user set name=? where id=?;", new String[]{"張三", "1"});

查詢操作

StringBuffer sb = new StringBuffer();
  Cursor cursor=DataBaseManager.getInstance(SqliteActivity.this).selectSQL("select * from user where id=?;",new String[]{"10"});
   if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex("id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String password = cursor.getString(cursor.getColumnIndex("password"));
                sb.append("id:" + id + "----" + "name:" + name + "------" + "password:" + password);
                Log.i("數據庫------", sb.toString());
            }
        }
        cursor.close();

事務,兩個或以上的操作相互關聯操作,如果其中一個失敗瞭,將會事務回滾,該次操作回到進入時的數據狀態,操作失敗。

 public void transactionData() {
        sqLiteDatabase.beginTransaction();
        try {
            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"王五", "8"});
            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"李四", "8"});
                     sqLiteDatabase.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sqLiteDatabase.endTransaction();
            sqLiteDatabase.close();
        }

    }

到此SQLite的使用就完成瞭,其實操作也是很簡單的,運行完成後,會在data/data/com.example.項目名/ 生成 一個user.db文件,可以通過shell命令查看,配置adb。也可以用第三方軟件導出查看(SQLiteExpert.zip),小編是用該軟件打開。後來發現其實在使用虛擬機的時候,虛擬機支持直接代開sqlite文件,所以直接打開就可以看到庫表。
如果你的sql基礎不是很好,可以試一試用第三方的開源框架,如litepal,該框架小編是在朋友的推薦下看瞭下,使用起來還是很簡單便捷的。
總結:1、感覺Manger管理類設計的不是很合理,如果小夥伴們有更好的設計思路,可以提供給小編。
2、相比於數據庫,sqlite的操作還是比較簡單便捷的。就是到生成文件找瞭一會。

You May Also Like