SQLite数据库
2015-07-15 22:58
453 查看
数据库即存储数据的仓库,不管是在PC端还是移动手机客户端都非常重要,应用也非常广泛,如手机中的通讯录应用,短消息应用,日历,邮箱应用等都基于本地数据库存储数据的.
Android手机中使用的是Sqlite数据库,SQLite是一款轻量级的关系型数据库,由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据.Sqlite已完全集成在Android手机中,所以我们在手机中使用sqlite数据库时不需要像PC端那样,先安装一个数据库软件在使用.Android
SDK的tools目录下提供了一sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。
命令行操作SQLite
程序运行生成的*.db文件一般位于”/data/data/项目名(包括所处包名)/databases/*.db”,因此要对数据库文件进行操作需要先找到数据库文件.
操作方式:
1.打开命令行窗口 cmd
输入>adb shell
进入shell操作模式.
2.#cd data/data/项目名(包名)/databases/
进入应用数据库所在目录
3.#sqlite3 *.db
打开数据库,进入数据库操作模式,现在可以用以前的SQL知识进行增删改查操作了
4.sqlite>.tables //显示所有表
5.sqlite>select * from talbesname //查询数据
可视化操作SQLite
对于命令行为熟悉的操作起来还是有点麻烦,没关系sqlite一样为我们提供了一款客户端工具来对数据库进行可视化操作.如sqlitebrowser
你只需要通过IDE开发环境文件管理导出数据库文件*.db用sqlitebrowser软件打开便可操作.
代码操作SQLite
通过上面的操作我们对Android数据库sqlite已有了一定认识,我们来一起看下用代码来操作数据库.
核心类 SQLiteDatabase
SQLiteDatabase 我们只要得到此类实例,就可能用以前SQL语句知识对数据库进行操作了.
非常简单,但一般我们不采用上述方式,而是通过一个叫SQLiteOpenHelper类来管理和更新数据库.
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。
使用方式:
SQLiteOpenHelper创建或打开数据库有两个方法 getReadableDatabase()创建或打开一个只读数据库
getWritableDatabase()创建或打开一个读写数据库,我们来看下它们的区别:
getWritableDatabase()和getReadableDatabase()的区别:
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.
现在已经能创建打开数据库和更新数据库了,接着我们来看下如何用android方式操作数据表.
代码操作SQLite_创建数据库,增,删,改,查
1.创建数据库
这里特别的地方是通过调用了SQLiteOpenHelper类的getReadableDatabase()方法来实现创建一个数据库的
SQLiteDatabase类为我们提供了很多种方法,而较常用的方法如下
数据的添删改查分别可以通过2种途径来实现
2. 数据的添加
1.使用insert方法
2.使用execSQL方式来实现
3.数据的删除
同样有2种方式可以实现
使用execSQL方式的实现
数据修改
同上,仍是2种方式
使用execSQL方式的实现
4.数据查询
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件
通过query实现查询的
各参数说明:
table:表名称
colums:列名称数组
selection:条件子句,相当于where
selectionArgs:条件语句的参数数组
groupBy:分组
having:分组条件
orderBy:排序类
limit:分页查询的限制
Cursor:返回值,相当于结果集ResultSet
针对游标(Cursor)也提供了不少方法
方法名称方法描述
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast()移动到最后一条记录
move(int offset) 移动到指定的记录
moveToNext()移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndex(String columnName) 获得指定列索引的int类型值
实现代码
通过rawQuery实现的带参数查询
查看源代码
打印帮助
Android手机中使用的是Sqlite数据库,SQLite是一款轻量级的关系型数据库,由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据.Sqlite已完全集成在Android手机中,所以我们在手机中使用sqlite数据库时不需要像PC端那样,先安装一个数据库软件在使用.Android
SDK的tools目录下提供了一sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。
命令行操作SQLite
程序运行生成的*.db文件一般位于”/data/data/项目名(包括所处包名)/databases/*.db”,因此要对数据库文件进行操作需要先找到数据库文件.
操作方式:
1.打开命令行窗口 cmd
输入>adb shell
进入shell操作模式.
2.#cd data/data/项目名(包名)/databases/
进入应用数据库所在目录
3.#sqlite3 *.db
打开数据库,进入数据库操作模式,现在可以用以前的SQL知识进行增删改查操作了
4.sqlite>.tables //显示所有表
5.sqlite>select * from talbesname //查询数据
可视化操作SQLite
对于命令行为熟悉的操作起来还是有点麻烦,没关系sqlite一样为我们提供了一款客户端工具来对数据库进行可视化操作.如sqlitebrowser
你只需要通过IDE开发环境文件管理导出数据库文件*.db用sqlitebrowser软件打开便可操作.
代码操作SQLite
通过上面的操作我们对Android数据库sqlite已有了一定认识,我们来一起看下用代码来操作数据库.
核心类 SQLiteDatabase
SQLiteDatabase 我们只要得到此类实例,就可能用以前SQL语句知识对数据库进行操作了.
1 | SQLiteDatabase db = openOrCreateDatabase( "scxh1502.db" , MODE_PRIVATE, null ); |
2 | db.execSQL( "create table student (id INTEGER NOT NULL,name TEXT,PRIMARY KEY(id))" ); |
3 | db.execSQL( "insert into student (id,name) values (1001,'张三')" ); |
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。
使用方式:
1 | public class DatabaseHelper extends SQLiteOpenHelper { |
2 | private static final String DB_NAME = "scxh1502.db" ; |
3 | private static final int DB_VERSION = 1 ; |
4 |
5 | private static DatabaseHelper DB_HELPER = null ; |
6 |
7 | public static DatabaseHelper getInstanceDatabaseHelper(Context context) { |
8 | if (DB_HELPER == null ) { |
9 | DB_HELPER = new DatabaseHelper(context); |
10 | } |
11 | return DB_HELPER; |
12 | } |
13 |
14 | public DatabaseHelper(Context context) { |
15 | super (context, DB_NAME, null , DB_VERSION); |
16 | Logs.v( "DatabaseHelper >>>>>>> " ); |
17 | } |
18 |
19 | /** |
20 | * 数据库创建时执行 |
21 | */ |
22 | @Override |
23 | public void onCreate(SQLiteDatabase db) { |
24 | String sql = "create table student (id INTEGER NOT NULL,name TEXT, number TEXT,PRIMARY KEY(id))" ; |
25 | db.execSQL(sql); |
26 | } |
27 |
28 | /** |
29 | * 数据库版本发生变化 |
30 | */ |
31 | @Override |
32 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { |
33 | Logs.v( "onUpgrade >>>>>> oldVersion :" + oldVersion + " newVersion :" + newVersion); |
34 | } |
35 |
36 | } |
1 | @Override |
2 | protected void onCreate(Bundle savedInstanceState) { |
3 | super .onCreate(savedInstanceState); |
4 |
5 | DatabaseHelper dbHelper = DatabaseHelper.getInstanceDatabaseHelper( this ); |
6 | SQLiteDatabase db = dbHelper.getReadableDatabase(); |
7 | } |
getWritableDatabase()创建或打开一个读写数据库,我们来看下它们的区别:
getWritableDatabase()和getReadableDatabase()的区别:
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.
现在已经能创建打开数据库和更新数据库了,接着我们来看下如何用android方式操作数据表.
代码操作SQLite_创建数据库,增,删,改,查
1.创建数据库
这里特别的地方是通过调用了SQLiteOpenHelper类的getReadableDatabase()方法来实现创建一个数据库的
1 | DatabaseHelper database = new DatabaseHelper( this ); //这段代码放到Activity类中才用this |
2 | SQLiteDatabase db = null ; |
3 | db = database.getReadalbeDatabase(); |
1 | ( int ) //删除数据行的便捷方法 |
2 | ( long ) insert(String table,String nullColumnHack,ContentValues values) //添加数据行的便捷方法 |
3 | ( int ) update(String table, ContentValues values, String whereClause, String[] whereArgs) //更新数据行的便捷方法 |
4 | ( void ) //执行一个SQL语句,可以是一个select或其他的sql语句 |
5 | ( void ) // 关闭数据库 |
6 | (Cursor) // 查询指定的数据表返回一个带游标的数据集 |
7 | (Cursor) rawQuery(String sql, String[] selectionArgs) // 运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别就是防止SQL注入) |
2. 数据的添加
1.使用insert方法
1 | ContentValues cv = new ContentValues(); //实例化一个ContentValues用来装载待插入的数据 |
2 | cv.put( "username" , "Jack Johnson" ); //添加用户名 |
3 | cv.put( "password" , "iLovePopMusic" ); //添加密码 |
4 | db.insert( "user" , null ,cv); //执行插入操作 |
1 | String sql ="insert into user(username,password) values ( 'Jack Johnson' , 'iLovePopMuisc' ); //插入操作的SQL语句 |
2 | db.execSQL(sql); //执行SQL语句 |
同样有2种方式可以实现
1 | String whereClause = "username=? and " sex=?"; //删除的条件 |
2 | String[] whereArgs = { "Jack Johnson" , "男" }; //删除的条件参数 |
3 | db.delete( "user" ,whereClause,whereArgs); //执行删除 |
1 | String sql = "delete from user where username='Jack Johnson'" ; //删除操作的SQL语句 |
2 | db.execSQL(sql); //执行删除操作 |
同上,仍是2种方式
1 | ContentValues cv = new ContentValues(); //实例化ContentValues |
2 | cv.put( "password" , "iHatePopMusic" ); //添加要更改的字段及内容 |
3 | String whereClause = "username=?" ; //修改条件 |
4 | String[] whereArgs = { "Jack Johnson" }; //修改条件的参数 |
5 | db.update( "user" ,cv,whereClause,whereArgs); //执行修改 |
1 | String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'" ; //修改的SQL语句 |
2 | db.execSQL(sql); //执行修改 |
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件
通过query实现查询的
1 | public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) |
table:表名称
colums:列名称数组
selection:条件子句,相当于where
selectionArgs:条件语句的参数数组
groupBy:分组
having:分组条件
orderBy:排序类
limit:分页查询的限制
Cursor:返回值,相当于结果集ResultSet
针对游标(Cursor)也提供了不少方法
方法名称方法描述
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast()移动到最后一条记录
move(int offset) 移动到指定的记录
moveToNext()移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndex(String columnName) 获得指定列索引的int类型值
实现代码
方法一
1 | Cursor c = db.query( "user" , null , null , null , null , null , null ); //查询并获得游标 |
2 | if (c.moveToFirst()){ //判断游标是否为空 |
3 | for ( int i= 0 ;i<c.getCount();i++){ |
4 | c.move(i); //移动到指定记录 |
5 | String username = c.getString(c.getColumnIndex( "username" ); |
6 | String password = c.getString(c.getColumnIndex( "password" )); |
7 | } |
8 | } |
方法二
1 | Cursor c = db.query( "user" , null , null , null , null , null , null ); //查询并获得游标 |
2 | while (cursor.moveToNext()){ |
3 | int id = cursor.getInt(cursor.getColumnIndex( "id" )); |
4 | String name = cursor.getString(cursor.getColumnIndex( "name" )); |
5 | String number = cursor.getString(cursor.getColumnIndex( "number" )); |
6 |
7 | Logs.v( "id :" +id + " name :" +name+ " number :" +number); |
8 | } |
查看源代码
打印帮助
1 | Cursor c = db.rawQuery( "select * from user where username=?" , new Stirng[]{ "Jack Johnson" }); |
2 | if (cursor.moveToFirst()) { |
3 | String password = c.getString(c.getColumnIndex( "password" )); |
4 | } |
相关文章推荐
- ORACLE中创建表空间,创建表,修改表,授权
- MPP 架构数据库
- Sql日期时间格式转换 备用
- 分布式Redis集群解决方案
- Oracle数据库实例间的连接—link
- ios即时通讯客户端开发之-mac上安装MySQL
- SQLite的使用详解
- mongodb备份数据库
- Mysql数据库存储引擎
- 数据库概况
- MyBatis知多少(8)关系型数据库
- 创建数据库和表————三大范式
- DATABASE CONNECTION ERROR (1): THE MYSQL ADAPTER 'MYSQLI' IS NOT AVAILABLE.解决办法
- 在oracle数据库中只知道他的生日,怎么查出他的年龄
- Windows下MongoDB的安装及配置
- ubuntu 重新安装mysql
- Linux下安装配置MongoDB数据库
- Linux下安装配置MongoDB数据库
- Memcached基础
- oracle中怎么比较两个日期的大小