編輯:關於Android編程
開發Android的同學都知道sdk已經為我們提供了一個SQLiteOpenHelper類來創建和管理SQLite數據庫,通過寫一個子類去繼承它,就可以方便的創建、管理數據庫。但是當我們需要去做增刪改查的操作的時候,就得通過getWritableDatabase獲取一個SQLiteDataBase,然後老老實實去寫操作值的put以及查詢返回的Cursor處理,其實我們可以搞一個對象來幫我們干這些事情,打造屬於你自己的數據庫操作類。
假設現在我們什麼都沒有,我們要去搞一個對象來給我們干這件事情,它需要有什麼才可以干呢?
先想想要做的事情:管理數據庫的操作
那要做數據庫的操作需要什麼就很簡單了吧?
1、要操作數據庫,所以需要一個SQLiteDataBase對象,可以通過SQLiteOpenHelper的子類來獲取。
2、此外數據庫要創建,還需要數據庫信息吧?那就直接變量引入。
3、有了數據庫信息,創建了數據庫,你要操作,怎麼也得告訴我操作哪個表。所以還得包含創建表和更新表的信息,由於表一般會有多張,所以這裡用一個數組變量。
有了信息還得交互,不然我怎麼知道你要怎麼創建表,所以我們在構造方法中直接獲取這些信息。
接下看上面文字的代碼表示
public abstract class DataBaseHelper {
/**
* 用來創建和獲取數據庫的SQLiteOpenHelper
*/
protected DBHelper mDbHelper;
/**
* 數據庫對象
*/
protected SQLiteDatabase mDb;
/**
* 數據庫信息
*/
private int mDbVersion;//版本
private String mDbName;//數據庫名
/**
* 創建表語句
*/
private String[] mDbCreateSql;
/**
* 更新表語句
*/
private String[] mDbUpdateSql;
protected abstract int getMDbVersion(Context context);
protected abstract String getDbName(Context context);
protected abstract String[] getDbCreateSql(Context context);
protected abstract String[] getDbUpdateSql(Context context);
public DataBaseHelper(Context context) {
this.mDbVersion = this.getMDbVersion(context);
this.mDbName = this.getDbName(context);
this.mDbCreateSql = this.getDbCreateSql(context);
this.mDbUpdateSql = this.getDbUpdateSql(context);
this.mDbHelper = new DBHelper(context,this.mDbName,null,this.mDbVersion);
}
protected void open(){
new Thread(new Runnable() {
@Override
public void run() {
mDb = mDbHelper.getWritableDatabase();
}
}).start();
}
protected SQLiteDatabase getDB(){
return this.mDb;
}
public void close(){
this.mDb.close();
this.mDbHelper.close();
}
private class DBHelper extends SQLiteOpenHelper{
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String[] arr = DataBaseHelper.this.mDbCreateSql;
//執行創建表語句
for (int i=0;i
代碼比較簡單,包含了進行數據庫操作要用到的各種信息,並且在初始化的進行了賦值。同時還提供了SQLiteDatabase的open、close。同時在這裡用到了抽象方法是因為考慮創建多個數據庫的情況,讓子類來提供具體的數據庫信息,我只管做創建和操作就行了。
這裡我們的數據庫操作類已經初顯雛形了,但是現在除了創建表還沒什麼用。操作類不提供簡便的操作還叫什麼操作類,下面就來說說操作。
我們要做操作類,無非是要簡化操作,就像當老板一樣。我告訴你一些用到的東西,你去給我完成這個事情。哈哈。
假如我現在就是要操作數據庫的老板,那我其實只想告訴你必要的事情,其它的我都不想做。
那麼必要的信息只有表名,要操作的字段和值,如果是刪除、更新、和查詢的話多加個篩選條件。接下來看代碼
/**
* 統一對ContentValues處理
* @param contentValues
* @param key
* @param value
*/
private void ContentValuesPut(ContentValues contentValues,String key,Object value){
if (value==null){
contentValues.put(key,"");
}else{
String className = value.getClass().getName();
if (className.equals("java.lang.String")){
contentValues.put(key,value.toString());
} else if (className.equals("java.lang.Integer")){
contentValues.put(key,Integer.valueOf(value.toString()));
} else if (className.equals("java.lang.Float")){
contentValues.put(key,Float.valueOf(value.toString()));
} else if (className.equals("java.lang.Double")){
contentValues.put(key,Double.valueOf(value.toString()));
} else if (className.equals("java.lang.Boolean")){
contentValues.put(key,Boolean.valueOf(value.toString()));
} else if (className.equals("java.lang.Long")){
contentValues.put(key,Long.valueOf(value.toString()));
} else if (className.equals("java.lang.Short")){
contentValues.put(key,Short.valueOf(value.toString()));
}
}
}
/**
* 根據數組的列和值進行insert
* @param tableName
* @param columns
* @param values
* @return
*/
public boolean insert(String tableName,String[] columns,Object[] values){
ContentValues contentValues = new ContentValues();
for (int rows = 0; rows < columns.length;++rows){
ContentValuesPut(contentValues,columns[rows],values[rows]);
}
long rowId = this.mDb.insert(tableName,null,contentValues);
return rowId!=-1;
}
/**
* 根據map來進行insert
* @param tableName
* @param columnValues
* @return
*/
public boolean insert(String tableName,Map columnValues){
ContentValues contentValues = new ContentValues();
Iterator iterator = columnValues.keySet().iterator();
while (iterator.hasNext()){
String key = (String) iterator.next();
this.ContentValuesPut(contentValues,key,columnValues.get(key));
}
long rowId = this.mDb.insert(tableName,null,contentValues);
return rowId!=-1;
}
/**
* 統一對數組where條件進行拼接
* @param whereColumns
* @return
*/
private String initWhereSqlFromArray(String[] whereColumns){
StringBuffer whereStr = new StringBuffer();
for (int i=0;i whereParams){
Set set = whereParams.keySet();
String[] temp = new String[whereParams.size()];
int i = 0;
Iterator iterator = set.iterator();
StringBuffer whereStr = new StringBuffer();
while (iterator.hasNext()){
String key = (String) iterator.next();
whereStr.append(key).append(" = ? ");
temp[i] = whereParams.get(key);
if (i 0 ;
}
/**
* 根據map值來進行update
* @param tableName
* @param columnValues
* @param whereParam
* @return
*/
public boolean update(String tableName,Map columnValues,Map whereParam){
ContentValues contentValues = new ContentValues();
Iterator iterator = columnValues.keySet().iterator();
String columns;
while (iterator.hasNext()){
columns = (String) iterator.next();
ContentValuesPut(contentValues,columns,columnValues.get(columns));
}
Map map = this.initWhereSqlFromMap(whereParam);
int rowNumber = this.mDb.update(tableName,contentValues,(String)map.get("whereSql"),(String[]) map.get("whereSqlParam"));
return rowNumber > 0;
}
/**
* 根據數組條件進行delete
* @param tableName
* @param whereColumns
* @param whereParam
* @return
*/
public boolean delete(String tableName,String[] whereColumns,String[] whereParam){
String whereStr = this.initWhereSqlFromArray(whereColumns);
int rowNumber = this.mDb.delete(tableName,whereStr,whereParam);
return rowNumber > 0;
}
/**
* 根據map來進行delete
* @param tableName
* @param whereParams
* @return
*/
public boolean delete(String tableName,Map whereParams){
Map map = this.initWhereSqlFromMap(whereParams);
int rowNumber = this.mDb.delete(tableName,map.get("whereSql").toString(),(String[]) map.get("whereSqlParam"));
return rowNumber > 0;
}
/**
* 查詢返回List
* @param sql
* @param params
* @return
*/
public List
上面的操作代碼就完畢了,這裡主要對增刪改的參數是數組和Map的情況進行了處理,對查詢的結果進行了處理,代碼比較簡單也都有注釋,這裡就不做特別說明了。到這裡一個數據庫操作類就成型了。
3、操作類的繼續完善
通過上面的過程已經可以使用了,那麼先來看看使用,我們只需要繼承操作抽象類告訴它具體的數據庫信息以及建表語句。
public class TestDBHelper extends DataBaseHelper {
private static TestDBHelper mTestDBHelper;
private TestDBHelper(Context context){
super(context);
}
public static TestDBHelper getInstance(Context context){
if (mTestDBHelper==null){
synchronized (DataBaseHelper.class){
if (mTestDBHelper==null){
mTestDBHelper = new TestDBHelper(context);
if (mTestDBHelper.getDB()==null||!mTestDBHelper.getDB().isOpen()){
mTestDBHelper.open();
}
}
}
}
return mTestDBHelper;
}
@Override
protected int getMDbVersion(Context context) {
return 1;
}
@Override
protected String getDbName(Context context) {
return "test.db";
}
@Override
protected String[] getDbCreateSql(Context context) {
String[] a = new String[1];
a[0] = "CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,gender TEXT,age INTEGER)";
return a;
}
@Override
protected String[] getDbUpdateSql(Context context) {
return new String[0];
}
}
重寫父類的抽象方法告訴它數據庫信息以及建表語句,然後提供一個單例供外部獲取,如果沒有open就open數據庫,接下來看看使用
4、使用
直接獲取,然後傳入你想操作的表信息,So Easy!
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button selectBtn;
private Button insertBtn;
private Button updateBtn;
private Button deleteBtn;
private TextView contentTv;
private TestDBHelper testDBHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testDBHelper = TestDBHelper.getInstance(getApplicationContext());
selectBtn = (Button) findViewById(R.id.select_btn);
insertBtn = (Button) findViewById(R.id.insert_btn);
updateBtn = (Button) findViewById(R.id.update_btn);
deleteBtn = (Button) findViewById(R.id.delete_bt);
contentTv = (TextView) findViewById(R.id.content_tv);
selectBtn.setOnClickListener(this);
insertBtn.setOnClickListener(this);
updateBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.select_btn:
List
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="hljs java">很簡單了,附一張演示圖
gif制作了做了壓縮,圖的效果不好請見諒
是不是簡單多了
yissan的博客,未經允許嚴禁轉載 http://blog.csdn.net/yissan
5、最後的完善
在第3步裡,我們的數據庫信息,和建表語句都是寫在具體的代碼裡的,這樣我們每次修改都要動代碼。Android推薦我們這些具體的信息都寫在配置文件xml裡面,那麼我們就來做一下修改。
建立一個db.xml
- test.db
- 1
- CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,gender TEXT,age INTEGER)
現在的獲取數據信息的代碼是這樣
@Override
protected int getMDbVersion(Context context) {
return Integer.valueOf(context.getResources().getStringArray(R.array.DATABASE_INFO)[1]);
}
@Override
protected String getDbName(Context context) {
return context.getResources().getStringArray(R.array.DATABASE_INFO)[0];
}
@Override
protected String[] getDbCreateSql(Context context) {
return context.getResources().getStringArray(R.array.CREATE_TABLE_SQL);
}
@Override
protected String[] getDbUpdateSql(Context context) {
return context.getResources().getStringArray(R.array.UPDATE_TABLE_SQL);
}
從配置文件當中獲取數據庫信息,這樣以後每次修改只需要修改xml文件就可以了。
6、結語
到此,一個數據庫操作類就完成啦,當然你可以根據自己的需要在其實添加更多的便捷操作方法。
這裡提供的操作類,在使用的時候我們還在需要在Activity中寫一些查詢的sql代碼,我們可以再搞一個統一做各種具體操作表的對象。
本文實例講述了Android編程實現自定義手勢的方法。分享給大家供大家參考,具體如下:之前介紹過如何在Android程序中使用手勢,主要是系統默認提供的幾個手勢,這次介紹
以前編程的時候,遇到倒計時的功能時,經常自己去寫,但其實Android已經幫封裝好了一個倒計時類CountDownTimer,其實是將後台線程的創建和Handler隊列封
SimpleVrPanorama其實這篇應該寫SimpleVrPanorama和simplevideowidget 兩個,但是由於篇幅過長就分開寫了演示用AS錄的沒有觸摸
概述:BitMap代表一張位圖,擴展名可以是.bmp或者.dib。位圖是Windows標准格式圖形文件,它將圖像定義為由點(像素)組成,每個點可以由多種色彩表示,包括2、