数据库的创建与升级
Android中专门提供了SQLiteOpenHelper帮助类,帮助我们创建和升级数据库。SQLiteOpenHelper是一个抽象类,要想使用它,我们必须创建一个自己的帮助类。并重写onCreate()
和onUpgrade()
l两个抽象方法,从而对它进行使用。
SQLiteOpenHelper有两个构造方法:
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory, int version)
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory, int version,DatabaseErrorHandler errorHandler)
/*
第一个参数为Context
第二个参数为数据库名,创建数据库时使用此名字
第三个参数允许我们在查询数据时返回一个自定义Cursor
第四个参数表示数据库当前的版本号,用于对数据库进行升级
第五个参数用于处理数据库的异常
*/
SQLiteOpenHelper中的方法:
返回类型 | 方法 |
---|---|
void | close() 关闭所有数据库对象(Close any open database object.) |
String | getDatabaseName() 获取使用构造函数时传入的数据库名 |
SQLiteDatabase | getReadableDatabase() 打开或创建一个只读的数据库对象 |
SQLiteDatabase | getWritableDatabase() 打开或创建一个可读写的数据库对象 |
abstract void | onCreate(SQLiteDatabase db) 当数据库创建时调用 |
void | onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) 当数据库降级时调用 |
void | onOpen() 当数据库打开时调用 |
abstract void | onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 当数据库升级时调用 |
void | setWriteAheadLoggingEnabled(boolean enabled) 是否打印预写式日志 |
数据库文件通常存放在/data/data/packagename/databases/目录下
数据库只有在getReadableDatabase()
或者getWritableDatabase()
被调用时才真正被打开或创建。
onCreate()
在数据库被创建时调用,重写这个方法创建表和表的初始种群
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(SQL_COMMAND);
//SQL_COMMAND为sql语句
}
当创建SQLiteOpenHelper对象时,需指定一个version参数,当参数高于之前的版本号时调用onUpgrade()
,当参数低于之前的版本号时调用onDowngrade()
代码实现:
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
public static final String CREATE_CATEGORY ="create table Category ("
+"id integer primary key autoincrement, "
+"category_name text, "
+"category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
添加数据
添加数据主要有两种方法
1.使用execSQL()
方法执行SQL语句,此方法适用于所有不返回结果的SQL语句
String sql = "insert into Book(name,author,pages,price)values(?,?,?,?)",
new String[]{"bookname","zsy","200","5.00"};
db.execSQL(sql);
//
2.使用insert()
方法
ContentValues values = new ContentValues();
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values);
insert()
方法接受3个参数,第一个是表名,第二个用于在未添加数据时给某些可为空的队列复制NULL,一般用不到此功能,传入null即可,第三个为ContentValues对象
更新数据
1.使用execSQL()
方法
2.使用updata()
方法
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});
updata()
接受4个参数
- 表名
- ContentValues对象,要更新的数据装在这里
- 4.约束更新一行或几行的数据,不指定的话默认更新所有行
删除数据
1.使用execSQL()
方法
2.使用delete()
方法
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[]{"500"});
delete()
接收三个参数
- 表名
- 3.约束删除某一行或某几行的数据,默认删除所有行
查询数据
1.使用execSQL()
方法
2.使用inquery()
方法
query()方法参数 | 对应SQL部分 | 描述 |
---|---|---|
table | from_table_name | 指定查询的表名 |
columns | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定where的拘束条件 |
selectionArgs | - | 为where中的占位符提供具体的值 |
groupBy | group by column | 指定需要group by的列 |
having | having column = value | 对 group by 后的结果进一步约束 |
orderBy | order by column1, column2 | 指定查询结果的排序方式 |
代码示例:
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
}while(cursor.moveToNext());
}
cursor.close();
不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:
- 通过使用 getCount() 方法得到结果集中有多少记录;
- 通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;
- 通过 getColumnNames() 得到字段名;
- 通过 getColumnIndex() 转换成字段号;
- 通过 getString(),getInt() 等方法得到给定字段当前记录的值;
- 通过 requery() 方法重新执行查询得到游标;
- 通过 close() 方法释放游标资源;