SQLite
Android中通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLite数据库不想其他的数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到广泛应用。Android也没有重复发明“轮子”,而是直接是用了SQLite数据库。
一、SQLiteDatabase
Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面我们先看看SQLiteDatabase的常用方法。
SQLiteDatabase的常用方法
方法名称 | 方法描述 |
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values) | 添加一条记录 |
delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() | 关闭数据库 |
1、打开或者创建数据库
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库,该方法的第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/data/data/package/databases/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
下面的代码创建了一个temp.db数据库
SQLiteDatabase.openOrCreateDatabase("/data/data/com.hualang.test/databases/temp.db",null);
2、创建表
创建一张表很简单。首先,编写创建表的SQL语句,然后,调用SQLiteDatabase的execSQL()方法便可以创建一张表了。
下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、username(用户名称)、password(密码)
private void createTable(SQLiteDatabase db){ //创建表SQL语句 String sql="create table usertable(id integer primary key autoincrement,username text,password text)"; //执行SQL语句 db.execSQL(sql);}
3、插入数据
插入数据有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数是空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;令一种方法是编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
下面的代码演示了如何插入一条记录到数据库。
方法1:
//插入数据private void insert(SQLiteDatabase db){ //插入数据SQL语句 String sql="insert into usertable(username,password) values('hualang','123456')"; //执行SQL语句 db.execSQL(sql);}
方法2:
private void insert(SQLiteDatabase db){ //实例化常量值 ContentValues cv = new ContentValues(); //添加用户名 cv.put("username","hualang"); //添加密码 cv.put("password","123456"); //插入 db.insert("usertable",null,cv);}
4、删除数据
和插入数据类似,删除数据也有两种方法:一种是调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数是删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
下面代码演示了如何删除记录
方法1:
//删除private void delete(SQLiteDatabase db){ //删除SQL语句 String sql = "delete from usertable where id = 6"; //执行SQL语句 db.execSQL(sql);}
方法2:
private void delete(SQLiteDatabase db){ //删除条件 String whereClause = "id=?"; //删除条件参数 String[] whereArgs = {String.valueOf(5)}; //执行删除 db.delete("usertable",whereClause,whereArgs);}
5、查询数据
查询数据相对比较傲复杂,因为查询可能会带来很多条件。不过熟悉SQL查询的读者都知道这只不过是把查询SQL封装成方法而已。下面看一个查询方法。
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
①table:表名称
②columns:列名称数组
③selection:条件字句,相当于where
④selectionArgs:条件字句,参数数组
⑤groupBy:分组列
⑥having:分组条件
⑦orderBy:排序列
⑧limit:分页查询限制
⑨Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
方法名称 | 方法描述 |
getCount() | 总记录条数 |
isFirst() | 判断是否第一条记录 |
isLast() | 判断是否最后一条记录 |
moveToFirst() | 移动到第一条记录 |
moveToLast() | 移动到最后一条记录 |
move(int offset) | 移动到指定记录 |
moveToNext() | 移动到下一条记录 |
moveToPrevious() | 移动到上一条记录 |
getColumnIndexOrThrow(String columnName) | 根据列名称获得列索引 |
getInt(int columnIndex) | 获得指定列索引的int类型值 |
getString(int columnIndex) | 获得指定列缩影的String类型值 |
下面的代码演示了如何查询数据类型
private void query(SQLiteDatabase db){ //查询获得游标 Cursor c = db.query("usertable",null,null,null,null,null,null); //判断游标是否为空 if(c.moveToFirst()) { //遍历游标 for(int i=0;i<c.getCount();i++) { c.move(i); //获得ID int id = c.getInt(0); //获得用户名 String username=c.getString(1); //获得密码 String password=c.getString(2); //输出用户信息 System.out.println(id+":"+username+":"+password); } }}
6、修改数据
和添加删除相同,修改数据有两种方式,一是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更行列ContentValues类型的键值对(Map),第三个参数是更新条件(where字句),第四个参数是更新条件数组。而是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
下面的代码演示了如何更新数据
private void update(SQLiteDatabase db){ //修改SQL语句 String sql = "update usertable set password = 654321 where id = 1"; //执行SQL db.execSQL(sql);}
方法2:
private void update(SQLiteDatabase db){ //实例化内容值 ContentValues values = new ContentValues(); //在values中添加内容 values.put("password","123321"); //修改条件 String whereClause = "id=?"; //修改添加参数 String[] whereArgs={String.valuesOf(1)}; //修改 db.update("usertable",values,whereClause,whereArgs);}
二、SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新,一般的用法是定义一个类继承之,并实现其抽象方法onCreate(SQLiteDatabase db)和opUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。
SQLiteOpenHelper常用方法
方法名称 | 方法描述 |
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) | 构造方法,一般是传递一个要创建的数据库名称name参数 |
onCreate(SQLiteDatabase db) | 创建数据库时调用 |
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) | 版本更新时调用 |
getReadableDatabase() | 创建或打开一个只读数据库 |
getWritableDatabase() | 创建或打开一个读写数据库 |
例如下面的代码演示
public class MainActivity extends Activity{public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//实例化数据库帮助类MyDbHelper helper = new MyDbHelper(this);//插入helper.insert();//查询helper.query();}//数据库帮助类class MyDbHelper extends SQLiteOpenHelper{//创建表SQL语句private static final String CREATE_TABLE_SQL = "create table usertable(id intger,name text)";//SQLiteDatabase实例private SQLiteDatabase db;//构造方法MyDbHelper(Context c){super(c,"test.db",null,2);}public void onCreate(SQLiteDatabase db){db.execSQL(CREATE_TABLE_SQL);}public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){}//插入方法private void insert(){//插入SQL语句String sql="insert into usertable(id,name) values(1,'hualang')";//执行插入getWriteableDatabase().execSQL(sql);}//查询方法private void query(){//查询获得游标Cursor c = getWritableDatabase().query("usertable",null,null,null,null,null,null);//判断游标是否为空if(c.moveToFirst()){//遍历游标for(int i=0;i<c.getCount();i++){c.move(i);int id = c.getInt(0);String name = c.getString(1);System.out.println(id+":"+name);}}}}}本文转自: http://hualang.iteye.com/blog/1005668
更多相关文章
- android:windowSoftInputMode属性详解以及editText监听键盘回车
- Android(安卓)Asynchronous Http Client-Android异步网络请求客
- android之蓝牙开发续(自动配对)
- Android启动画面的实现方法
- android 一键锁屏 开发
- Android(安卓)如何创建组合控件
- 提高数倍工作效率的Android(安卓)Studio技巧
- Android使用SharedPreferences保存List列表数据
- Android事件分发机制详解(二)