说明
应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息
文件类型: .db
数据保存的路径: /data/data/projectPackage/databases/xxx.db
默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作
应用卸载时会删除此数据
sqlite数据库
SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器, 移动设备的数据库存储都使用SQLite, 它的特点:
安装文件小: 最小只有几百K, Android系统已经安装
支持多操作系统: Android, WP, IOS, Windows, Linux等
支持多语言: 比如 Java 、 PHP、C#等.
处理速度快: 处理速度比Mysql, Oracle, SqlServer都要快(数据量不是特别大)
Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)
数据类型
Sqlite支持的数据类型与Mysql相似, 常用的数据类型:
INT/INTEGER : 整数
FLOAT/DOUBLE : 小数
CHAR/VARCHAR/TEXT : 字符串文本
BLOB : 文件
DATE/ DATETIME : 日期/日期时间
Sqlite建表
Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:
最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换, 但除varchar类型外最好指定类型
Sqlite中的主键最名称建议使用_id
create table employee (
_id integer primary key autoincrement, /*主键,自增长*/
name varchar, /*字符串*/
salary double, /*小数*/
birthday date /*日期, 可直接插入日期格式字符串*/
)
sqlite的crud语句
/*插入*/
INSERT INTO employee (name,salary,birthday) VALUES('Tom', 8000, '1988-09-21');
/*删除*/
DELETE FROM employee WHERE _id=2
/*更新*/
UPDATE employee SET name='Jack',salary=salary+1000 WHERE _id=1
/*查找*/
SELECT * FROM employee where _id=3
相关API
SQLiteOpenHelper: 数据库操作的抽象帮助类
SQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) : 构造方法, 指定数据库文件名和版本号
abstract void onCreate(SQLiteDatabase db) : 用于创建表
abstract void onUpgrade() : 用于版本更新
SqliteDatabase getReadableDatabase() : 得到数据库连接
SqliteDatabase: 代表与数据库的连接的类
long insert(): 用于执行insert SQL, 返回id值
int update(): 用于执行update SQL
int delete(): 用于执行delete SQL
Cursor query(): 用于执行select SQL, 返回包含查询结果数据的Cursor
void execSql(sql) : 执行sql语句
beginTransaction(): 开启事务
setTransactionSuccessful(): 设置事务是成功的
endTransaction(): 结束事务, 可能提交事务或回滚事务
openDatabase(String path, CursorFactory factory, int flags): 得到数据库连接
Cursor : 包含所有查询结果记录的结果集对象(光标,游标)
int getCount() : 匹配的总记录数
boolean moveToNext() : 将游标移动到下一条记录的前面
Xxx getXxx(columnIndex) : 根据字段下标得到对应值
int getColumnIndex(columnname): 根据字段名得到对应的下标
案列
首先第一步创建一个帮助类
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, int version) {
super(context, "dongge.db", null, version);
}
/**
* 什么时候才会创建数据库文件?
* 1). 数据库文件不存在
* 2). 连接数据库
* 什么时候调用?
* 当数据库文件创建时调用(1次)
* 在此方法中做什么?
* 建表
* 插入一些初始化数据
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG", "DBHelper onCreate()");
//建表
String sql = "create table person( _id integer primary key autoincrement,name varchar,age int)";
db.execSQL(sql);
//插入一些初始化数据
db.execSQL("insert into person(name,age) value ('Tom1',21)");
db.execSQL("insert into person(name,age) value ('Tom2',22)");
db.execSQL("insert into person(name,age) value ('Tom3',23)");
}
//当传入的版本号大于数据库的版本号时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("TAG", "DBHelper onUpgrade()");
}
}
创建表
DBHelper dbHelper = new DBHelper(this, 1);
SQLiteDatabase database = dbHelper.getReadableDatabase();//与数据库建立连接
Toast.makeText(this, "创建数据库", Toast.LENGTH_SHORT).show();
更新表
public void testUpdateDB(View v) {
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
Toast.makeText(this, "更新数据库", Toast.LENGTH_SHORT).show();
}
插入数据库
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//执行插入语句
ContentValues values = new ContentValues();
values.put("name", "jack");
values.put("age", 18);
long id = database.insert("person", null, values);
//关闭连接
database.close();
//提示
Toast.makeText(this, "id==" + id, Toast.LENGTH_SHORT).show();
更新数据库
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//执行插入语句
ContentValues values = new ContentValues();
values.put("name", "jack2");
values.put("age", 20);
int updateCount = database.update("person", values, "_id=?", new String[]{"4"});
database.close();
Toast.makeText(this, "updateCount==" + updateCount, Toast.LENGTH_SHORT).show();
删除数据
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//执行删除语句
int delete_id = database.delete("person", "_id=?", new String[]{"2"});
//关闭数据库
database.close();
Toast.makeText(this, "delete_id==" + delete_id, Toast.LENGTH_SHORT).show();
查询语句
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
//执行查询语句
//Cursor cursor = database.query("person", null, null, null, null, null, null);//查询所有数据
Cursor cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);//查询所有数据
//得到匹配的记录数
int count = cursor.getCount();
Log.e("TAG", String.valueOf(count));
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.e("TAG", "id=" + id + ";age=" + age + ";name=" + name);
}
//关闭
cursor.close();
database.close();
测试事务处理
一个功能中对数据库进行的多个操作: 要就是都成功要就都失败
事务处理的3步:
* 1. 开启事务(获取连接后)
* 2. 设置事务成功(在全部正常执行完后)
* 3. 结束事务(finally中)
SQLiteDatabase database = null;
int updateCount = 0;
try {
DBHelper dbHelper = new DBHelper(this, 2);
//获取连接
database = dbHelper.getReadableDatabase();
//开启事务(连接成功后)
database.beginTransaction();
//执行更新第一条语句
ContentValues values = new ContentValues();
values.put("age", 110);
updateCount = database.update("person", values, "_id=?", new String[]{"1"});
//出现异常
boolean isFlage = true;
if (isFlage) {
throw new RuntimeException("出异常了");
}
//执行更新第二条语句
values = new ContentValues();
values.put("age", 200);
int updateCount2 = database.update("person", values, "_id=?", new String[]{"3"});
//2. 设置事务成功(在全部正常执行完后)
database.setTransactionSuccessful();
} catch (RuntimeException e) {
e.printStackTrace();
Toast.makeText(this, "出异常啦!!!", Toast.LENGTH_SHORT).show();
} finally {
//结束事务
database.endTransaction();
database.close();
}
}