一、SQLite数据库的使用
为了方便使用SQLite数据库,Android SDK提供了一系列对数据库进行操作的类和接口,接下来针对这些类和接口进行简单介绍。
1.SQLiteOpenHelper类
SQLiteOpenHelper是一个抽象类,该类用于创建数据库和数据库版本更新。常用方法如下:
所有继承了这个类的类都必须实现下面这样的一个构造方法:
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
第一个参数:Context类型,上下文对象。
第二个参数:String类型,数据库的名称
第三个参数:CursorFactory类型
第四个参数:int类型,数据库版本
下面是这个类的几个方法:
方法名 返回类型
描述 备注
getReadableDatabase() synchronized SQLiteDatabase 创建或打开一个数据库 可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作,如新建一个表,插入一条数据等
getWritableDatabase() synchronized SQLiteDatabase 创建或打开一个可以读写的数据库
onCreate(SQLiteDatabase db) abstract void 第一次创建的时候调用
onOpen(SQLiteDatabase db) void 打开数据库
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) abstract void
升级数据库
close() synchronized void 关闭所有打开的数据库对象
2.SQLiteDatabase类
SQLiteDatabase是数据可靠访问类,该类封装了一系列数据库操作的API,可以对数据进行增删改查操作。常用方法如下:
(1)db.insert(table, nullColumnHack, values)
第一个参数是表名称
第二个参数是空列的默认值
第三个参数是ContentValues类型的一个封装了列名称和列值的Map;
(2)db.delete(table, whereClause, whereArgs)
第一个参数是表名称
第二个参数是删除条件
第三个参数是删除条件值数组
(3)db.update(table, values, whereClause, whereArgs)
第一个参数是表名称
第二个参数是更行列ContentValues类型的键值对(Map)
第三个参数是更新条件(where字句)
第四个参数是更新条件数组
(4)db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
各个参数的意义说明:
①table:表名称
②columns:列名称数组
③selection:条件字句,相当于where
④selectionArgs:条件字句,参数数组
⑤groupBy:分组列
⑥having:分组条件
⑦orderBy:排序列
⑧limit:分页查询限制
(5)db.execSQL(sql) // 执行任何SQL语句
(6)db.close() 关闭数据库
3.Cursor接口
Cursor是一个游标接口,在数据库中作为返回值,相当于结果集ResultSet。提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等。
Cursor常见方法如下:
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列缩影的String类型值
以上就是Android SDK提供操作SQLite数据的一些类和接口以及常用的方法介绍。
二、数据库的常用操作
1.创建SQLite数据库
需创建一个类来继承SQLiteOpenHelper,重写onCreate()方法,并在该方法中执行数据库的命令。具体代码如下:
public class MyHelper extends SQLiteOpenHelper {
// 由于父类没有无参构造函数, 所以子类必须指定调用父类哪个有参的构造函数
public MyHelper(Context context) {
super(context, "itcast.db", null, 2);
}
//数据库第一被创建时调用该方法
public void onCreate(SQLiteDatabase db) {
System.out.println("onCreate");
//初始化数据库的表结构,并自行一条建表的SQL语句
db.execSQL("CREATE TABLE account(_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "name VARCHAR(20)," + // 姓名列
"balance INTEGER)"); // 金额列
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onUpgrade");
}
}
2.增加一条数据
向表插入数据前,首先要得到一个可读写的SQLiteDatabase对象,具体代码如下:
public void insert(Account account) {
SQLiteDatabase db = helper.getWritableDatabase(); // 获取数据库对象
// 用来装载要插入的数据的 Map<列名, 列的值>
ContentValues values = new ContentValues();
values.put("name", account.getName());
values.put("balance", account.getBalance());
long id = db.insert("account", null, values); // 向account表插入数据values,
account.setId(id); // 得到id
db.close(); // 关闭数据库
}
3.修改一条数据
使用SQLiteDatabase的update()方法修改表的数据,具体代码如下:
public int update(Account account) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues(); // 要修改的数据
values.put("name", account.getName());
values.put("balance", account.getBalance());
int count = db.update("account", values, "_id=?",
new String[] { account.getId() + "" }); // 更新并得到行数
db.close();
return count;
}
4.删除一条数据
//根据id 删除数据
public int delete(long id) {
SQLiteDatabase db = helper.getWritableDatabase();
// 按条件删除指定表中的数据, 返回受影响的行数
int count = db.delete("account", "_id=?", new String[] { id + "" });
db.close();
return count;
}
5.查询一条数据
public List<Account> queryAll() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("account", null, null, null, null, null,
"balance DESC");
List<Account> list = new ArrayList<Account>();
while (c.moveToNext()) {
long id = c.getLong(c.getColumnIndex("_id")); // 可以根据列名获取索引
String name = c.getString(1);
int balance = c.getInt(2);
list.add(new Account(id, name, balance));
}
c.close();
db.close();
return list;
}
注意,在使用完Cursor时一定要及时关闭,否则会造成内存泄漏。
464

被折叠的 条评论
为什么被折叠?



