转载请注明出处:http://www.jb51.cc/article/p-gntphaji-zw.html
本文出自【DylanAndroid的博客】
【玩转sqlite系列】(二)sqlite创建和打开数据库的三种方式
在上一篇 【玩转SQLite系列】(一)初识SQLite,重拾sql语句 中已经简单了解了下sqlite,不了解的可以去看一下。
我们发现,在Android中使用sqlite数据库的时候,创建和打开数据库的时候不止继承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);
}
/** * 查看手机中由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
第二种方式: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去实现对数据库的操作。