欢迎大家关注我的微信公众号“IT工匠”获取更多资源(涉及算法、数据结构、java、深度学习、计算机网络、python、Android等互联网技术资料)。
Android 提供了几种方法用来保存数据,使得这些数据即使在程序结束以后依然不会丢失。这些方法有:
但有时候我们需要对保存的数据进行一些复杂的操作,或者数据量很大,超出了文本文件和Preference的性能能的范围,所以需要一些更加高效的方法来管理,从Android1.5开始,Android就自带SQLite数据库了,SQLite它是一个独立的,无需服务进程,支持事务处理,可以使用SQL语言的数据库。
Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
创建数据库
Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类根据开发应用程序的需要,封装创建和更新数据库使用的逻辑就行了。
SQLiteOpenHelper 的子类,至少需要实现三个方法,注意看注释:
public class DatabaseHelper extends SQLiteOpenHelper { /** * @param context 上下文环境(例如,一个 Activity) * @param name 数据库名字 * @param factory 一个可选的游标工厂(通常是 Null) * @param version 数据库模型版本的整数 * * 会调用父类 SQLiteOpenHelper的构造函数 */ public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 在数据库第一次创建的时候会调用这个方法 * *根据需要对传入的SQLiteDatabase 对象填充表和初始化数据。 */ @Override public void onCreate(SQLiteDatabase db) { } /** * 当数据库需要修改的时候(两个数据库版本不同),Android系统会主动的调用这个方法。 * 一般我们在这个方法里边删除数据库表,并建立新的数据库表. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号 } @Override public void onOpen(SQLiteDatabase db) { // 每次成功打开数据库后首先被执行 super.onOpen(db); }}
继承SQLiteOpenHelper之后就拥有了以下两个方法:
DatabaseHelper database = new DatabaseHelper(context);//传入一个上下文参数SQLiteDatabase db = null;db = database.getWritableDatabase();
上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,就可以查询或者修改数据库。
SQLiteDatabase类为我们提供了很多种方法,而较常用的方法如下:
当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
创建表和索引
为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL语句。如果没有异常,这个方法没有返回值。
例如,你可以执行如下代码:
db.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT);");
这条语句会创建一个名为 user的表,表有一个列名为 _id,并且是主键,这列的值是会自动增长的整数。另外还有两列:username( 字符 ) 和 password( 字符 )。 SQLite 会自动为主键列创建索引。
通常情况下,第一次创建数据库时创建了表和索引。要 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。
添加数据
有两种方法可以给表添加数据。
①可以使用 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL() 方法适用于所有不返回结果的 SQL 语句。例如:
String sql = "insert into user(username,password) values ('finch','123456');//插入操作的SQL语句db.execSQL(sql);//执行SQL语句
②使用 SQLiteDatabase 对象的 insert()。
ContentValues cv = new ContentValues();cv.put("username","finch");//添加用户名cv.put("password","123456"); //添加密码db.insert("user",null,cv);//执行插入操作
更新数据(修改)
①使用SQLiteDatabase 对象的 update()方法。
ContentValues cv = new ContentValues();cv.put("password","654321");//添加要更改的字段及内容String whereClause = "username=?";//修改条件String[] whereArgs = {"finch"};//修改条件的参数db.update("user",cv,whereClause,whereArgs);//执行修改
该方法有四个参数:
②使用execSQL方式的实现
String sql = "update [user] set password = '654321' where username="finch";//修改的SQL语句db.execSQL(sql);//执行修改
删除数据
①使用SQLiteDatabase 对象的delete()方法。
String whereClause = "username=?";//删除的条件String[] whereArgs = {"finch"};//删除的条件参数db.delete("user",whereClause,whereArgs);//执行删除
②使用execSQL方式的实现
String sql = "delete from user where username="finch";//删除操作的SQL语句db.execSQL(sql);//执行删除操作
查询数据
①使用 rawQuery() 直接调用 SELECT 语句
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"finch"});if(cursor.moveToFirst()) { String password = c.getString(c.getColumnIndex("password"));}
返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。
如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用下面的 query() 方法会方便很多。
②通过query()实现查询
query() 方法用 SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。除了表名,其他参数可以是 null。所以代码可写成:
Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标if(c.moveToFirst()){//判断游标是否为空 for(int i=0;i<c.getCount();i++){ c.move(i);//移动到指定记录String username = c.getString(c.getColumnIndex("username");String password = c.getString(c.getColumnIndex("password")); }}
使用游标
不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:
例如,下面代码遍历 user表:
Cursor result=db.rawQuery("SELECT _id, username, password FROM user"); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); String password =result.getString(2); // do something useful with these result.moveToNext(); } result.close();
以上就是sqlite的常用方法。