一、 SQLiteOpenHelper辅助类

SQLiteOpenHelper类是一个辅助类,用于创建或打开数据库。
该类的使用方法一般是自定义一个子类,继承自SQLiteOpenHelper,并覆写其中最关键的两个方法:onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。当新建一个数据库时会调用前者,一般在里面做一些创建表或视图的操作。数据库版本升级时则会调用后者。

定义好子类后(假如叫SqlHelper),只要调用SqlHelper对象的getReadableDatabase()方法或getWritableDatabase()方法即可返回一个SQLiteDatabase对象。如果是第一次调用,则会创建数据库。随后可使用SQLiteDatabase对象的方法进行数据操作,如:execSQL(), insert(), update(), query(), rawQuery(), delete()等。

PS:通过该方法创建的数据库存放的目录是固定的,其路径为/data/data/packageName/databases/。

二、Context类的openOrCreateDatabase()方法

openOrCreateDatabase(String dbName, int mode, CursorFactory factory);

  • dbName:数据库名称。
  • mode:数据库操作模式。默认值为MODE_PRIVATE(即0)。可选值:MODE_WORLD_READABLE, MODE_WORLD_WRITABLE, MODE_ENABLE_WRITE_AHEAD_LOGGING
  • factory:附加的一个工厂类,当SQLiteDatabase实例的query函数被调用时,会使用该工厂类返回一个Cursor。可为null。
1
2
3
4
5
6
7
8
9
10
11
12
13
private static final String DATABASE_NAME = “myDatabase.db”;
private static final String DATABASE_TABLE = “mainTable”;
private static final String DATABASE_CREATE =
“create table “ + DATABASE_TABLE +
“ ( _id integer primary key autoincrement,” +
“column_one text not null);”;
SQLiteDatabase myDatabase;
private void createDatabase() {
myDatabase = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
myDatabase.execSQL(DATABASE_CREATE);
}

PS:该方法得到的数据库文件,其存储路径与上一方法相同。

三、直接调用SQLiteDatabase类的静态方法openOrCreateDatabases()

SQLiteDatabase类有几个静态方法可直接打开或创建数据库。
//等同于openDatabase(path, factory, SQLiteDatabase.CREATE_IF_NECESSARY)

openOrCreateDatabase(String path, CursorFactory factory)
//等同于openDatabase(file.getPath(), factory, SQLiteDatabase.CREATE_IF_NECESSARY)

openOrCreateDatabase(File file, CursorFactory factory)
//等同于openDatabase(file.getPath(), factory, SQLiteDatabase.CREATE_IF_NECESSARY, errorHandler)

openOrCreateDatabase(String path, CursorFactory factory, DatabaseErrorHandler errorHandler)

PS:该方法打开或创建的数据库文件可与上述两个方法的路径不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private static final String DATABASE_NAME = "xiangjie.db";
private static final String DATABASE_TABLE = "test";
private static final String DATABASE_CREATE =
"create table " + DATABASE_TABLE +
" ( _id integer primary key autoincrement," +
"column_one text not null)";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_green_dao);
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME, null);
//db.execSQL("create table test ( _id integer primary key autoincrement,column_one text not null)");
// db.execSQL("insert into test (column_one) values(?)",new Object[]{"1111"});
Cursor cursor = db.rawQuery("select * from test;",null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);//获取第一列的值
Log.d("Q_M:",id);
}
cursor.close();
db.close();
}

最后记住,不管用何种方式打开了数据库,获得的SQLite对象不再使用时,都要调用close()来关闭打开的数据库,否则抛出IllegalStateException异常。