Android SQLite 简易指北
Android SQLite
- SQLite一款开源的, 轻量级的数据库.
- 以文本文件的形式存储数据.
- SQLite支持所有标准的关系型数据库特性.
- SQLite运行时占用内存非常少(约250 KByte).
- 使用简单, 无需安装配置.
SQLite数据库存储类型支持TEXT(类似Java中的String), INTEGER(类似Java中的LONG), REAL(类似JAVA中的double).所有其他的类型都在存储前转换成上述类型. 实际上SQLite数据库是无类型检查的.
More information about SQLite can be found on the SQLite website
基本SQL语句
表操作
- 创建表
CREATE TABLE products (_id INTEGER PRIMARY KEY AUTOINCREMENT, productname TEXT)
- 删除表
DROP TABLE products
增查改删CRUD
- 增Create
INSERT INTO products VALUES (NULL, 'apple')
- 查Retrieve
SELECT * FROM products WHERE productname='apple'
- 改Update
UPDATE products SET productname='orange' WHERE _id=1
- 删Delete
DELETE FROM products WHERE productname='apple'
使用SQL Helper操作数据库
我们通过继承SQLiteOpenHelper类来实现我们自己的数据库管理类, 在构造器中要调用父类SQLiteOpenHelper的构造器声明数据库名和当前数据库版本号.
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在这个类中有两个需要重写的方法用来创建和更新数据库, 两个方法都接收一个SQLiteDatabase对象作为参数, :
-
onCreate()
- 构造数据的方法, 如果数据库已经连接但是还没有创建, 系统框架会调用这个方法. 我们在此处创建数据库表. -
onUpgrade()
- 当已存在的数据库版本号与代码中声明的版本号不同时系统调用此方法升级数据库.(与之类似的还有onDowngrade()
方法).
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "handler created");
String sql = "create table " + TABLE_PRODUCTS + "(" +
COL_ID + " integer primary key autoincrement, " +
COL_PRODUCT_NAME + " text );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
官方建议数据库表中包含_id
字段作为主键, 一些Android功能依赖于此字段.
SQLiteOpenHelper类提供getReadableDatabase()
和getWriteableDatabase()
方法来访问数据库对象, 分别是只读和读写模式.
SQLiteDatabase
SQLiteDatabase提供如下方法用于操作数据库:
long insert(String table, String nullColumnHack, ContentValues values)
插入int delete(String table, String whereClause, String[] whereArgs)
删除int update(String table, ContentValues values, String whereClause, String[] whereArgs)
更新Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
查询void execSQL(String sql)
直接执行sql语句.Cursor rawQuery(String sql, String[] selectionArgs)
直接运行sql查询语句.void close()
释放对象引用.
ContentValues
对象可以定义一组键值对. key
代表数据库表中的列名, value
代表对应列的值.
参数化的查询方式可以避免SQL注入攻击, 同时更具可读性.
insert()
代码实例:
// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_CONTENT, content);
// Insert the new row, returning the primary key value of the new row
long newRowId;
newRowId = db.insert(
FeedEntry.TABLE_NAME,
FeedEntry.COLUMN_NAME_NULLABLE,
values);
游标Cursor
查询操作返回一个游标对象. Cursor代表一次查询的结果并且指向查询结果中的一行. 这样Android可以有效的缓存查询结果, 因为它不会把所有的结果加载进内存.
getCount()
获得结果的数量.moveToFirst()
moveToNext()
等方法用于移动游标.isAfterLast()
检验是否游标移动到最后.getString(int columnIndex)
获取当前游标位置的数据, 还可以是getLong()
...void close()
游标在使用结束后需要关闭.
示例代码
简单起见, 示例代码中使用直接执行SQL语句的方式进行数据库操作.
public class DBHandler extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "products.db";
private static final String TABLE_PRODUCTS = "products";
private static final String COL_ID = "_id";
private static final String COL_PRODUCT_NAME = "productname";
private static final String TAG = "ysz";
public DBHandler(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TABLE_PRODUCTS + "(" +
COL_ID + " integer primary key autoincrement, " +
COL_PRODUCT_NAME + " text );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void insert(String name) {
SQLiteDatabase db = getWritableDatabase();
for (int i = 1; i < 499; i++) {
db.execSQL("insert into products values (null, ?)", new String[]{name});
}
db.close();
}
public void delete(String name) {
SQLiteDatabase db = getWritableDatabase();
db.execSQL("delete from products where productname=?", new String[]{name});
db.close();
}
public String getAllProducts() {
StringBuffer buffer = new StringBuffer();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_PRODUCTS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
buffer.append(cursor.getString(1));
buffer.append("\n");
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return buffer.toString();
}
}
参考
Android SQLite database and content provider - Tutorial