轉載請註明出處:http://blog.csdn.net/linglongxin24/article/details/53234396
本文出自【DylanAndroid的博客】
- 【玩轉SQLite系列】文章目錄
【玩轉SQLite系列】(二)SQLite創建和打開數據庫的三種方式
在上一篇 【玩轉SQLite系列】(一)初識SQLite,重拾sql語句 中已經簡單瞭解了下SQLite,不瞭解的可以去看一下。
我們發現,在Android中使用SQLite數據庫的時候,創建和打開數據庫的時候不止繼承SQLiteOpenHelper
這一種方式。目前我至少發現了三種方式:1.自定義一個類繼承SQLiteOpenHelper;
2.使用Context.openOrCreateDatabase();
3.SQLiteDatabase.openOrCreateDatabase();
那麼這三種方式到底有什麼不同?
第一種方式:繼承SQLiteOpenHelper打開或創建數據庫
特點:可以在升級數據庫版本的時候在回調函數裏面做相應的操作
- 1.創建MySQLiteOpenHelper類
package cn.bluemobi.dylan.sqlite;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.logging.Logger;
/**
* Android操作使用SQLite的幫助類
* Created by dylan on 2016-11-19.
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private final String TAG = "MySQLiteOpenHelper";
/**
* 構造函數
* 一般用於在這裏創建數據庫,指定表名和版本號等
*
* @param context 上下文對象
* @param name 數據庫名稱
* @param factory 遊標工程
* @param version 數據版本號 >=1
*/
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.d(TAG, "MySQLiteOpenHelper");
}
/**
* 創建數據庫時調用
* <p>
* 一般用於在創建數據表
*
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "onCreate");
}
/**
* 數據庫升級更新時調用
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "onUpgrade");
}
}
- 2.創建數據庫
/**
* 第一種方式:繼承SQLiteOpenHelper打開或創建數據庫
* 特點:可以在升級數據庫版本的時候在回調函數裏面做相應的操作
*
* @param v
*/
public void sQLiteOpenHelper(View v) {
/**指定數據庫的表名爲info.db,版本號爲1**/
MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(this, Contacts.DATABASE_NAME, null, Contacts.DATABASE_VERSION);
/**得到一個可寫的數據庫SQLiteDatabase對象**/
SQLiteDatabase sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
/**查看改對象做添加的數據庫**/
showDataBase(sqLiteDatabase);
}
- 3.查看數據庫文件是否創建成功
由於我用的是真機測試,而且沒有Root,所以暫時採用這種方式去查看數據庫文件是否創建成功
/**
* 查看手機中由SQLiteDatabase創建的的數據庫文件
*/
public void showDataBase(SQLiteDatabase sqLiteDatabase) {
List<Pair<String, String>> ll = sqLiteDatabase.getAttachedDbs();
for (int i = 0; i < ll.size(); i++) {
Pair<String, String> p = ll.get(i);
Log.d(Contacts.TAG, p.first + "=" + p.second);
}
}
4.打印結果
11-19 20:58:51.845 3422-3422/cn.bluemobi.dylan.sqlite D/SQLite: main=/data/data/cn.bluemobi.dylan.sqlite/databases/info.db
可以看出info.db數據庫文件已經成功創建。
第二種方式:Context.openOrCreateDatabase打開或創建數據庫
特點:可以指定數據庫文件的操作模式
- 實現代碼
/**
* 第二種方式:Context.openOrCreateDatabase打開或創建數據庫
* 特點:可以指定數據庫文件的操作模式
*
* @param v
*/
public void context(View v) {
/**指定數據庫的名稱爲info2.db,並指定數據文件的操作模式爲MODE_PRIVATE**/
SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase(Contacts.DATABASE_NAME2, MODE_PRIVATE, null);
/**查看改對象所創建的數據庫**/
showDataBase(sqLiteDatabase);
}
查看數據庫文件是否創建成功
11-19 21:08:30.732 3422-3422/cn.bluemobi.dylan.sqlite D/SQLite: main=/data/data/cn.bluemobi.dylan.sqlite/databases/info2.db
第三種方式:SQLiteDatabase.openOrCreateDatabase打開或創建數據庫
特點:可以指定數據庫文件的路徑
- 實現代碼
/**
* 第三種方式:SQLiteDatabase.openOrCreateDatabase打開或創建數據庫
* 特點:可以指定數據庫文件的路徑
*
* @param v
*/
public void sQLiteDatabase(View v) {
File dataBaseFile = new File(Environment.getExternalStorageDirectory() + "/sqlite", Contacts.DATABASE_NAME3);
if (!dataBaseFile.getParentFile().exists()) {
dataBaseFile.mkdirs();
}
SQLiteDatabase sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(dataBaseFile, null);
showDataBase(sqLiteDatabase);
}
查看數據庫文件是否創建成功
11-19 21:09:32.767 3422-3422/cn.bluemobi.dylan.sqlite D/SQLite: main=/storage/emulated/0/sqlite/info3.db
最後我們通過查閱源碼發現,其實繼承SQLiteOpenHelper和Context.openOrCreateDatabase最後都是會調用SQLiteDatabase.openOrCreateDatabase去實現對數據庫的操作。