Sqlite数据库
1 特点
- 安装文件小: 最小只有几百K, Android系统已经安装
- 支持多操作系统: Android, WP, IOS, Windows,Linux等
- 支持多语言: 比如 Java 、 PHP、C#等.
- 处理速度快: 处理速度比Mysql, Oracle,SqlServer都要快(数据量不是特别大)
- Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)
2 Sqlite数据库客户端
3 Sqlite数据库命令行
- adb shell 进入系统根目录
- cd data/data/…/databases : 进入包含数据库文件的文件夹下
- sqlite3 contacts2.db : 使用sqlite3命令连接指定的数据库文件, 进入连接模式
- .help : 查看命令列表
- .tables : 查看所有表的列表
- 执行insert/delete/update/select语句
- .exit : 退出数据库连接模式
- Ctrl + C : 直接退出sell模式
4 数据类型
Sqlite支持的数据类型与Mysql相似, 常用的数据类型
- INT/INTEGER : 整数
- FLOAT/DOUBLE : 小数
- CHAR/VARCHAR/TEXT : 字符串文本
- BLOB : 文件
- DATE/ DATETIME : 日期/日期时间
5 Sqlite建表
Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:
- 最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换, 但除varchar类型外最好指定类型。
- Sqlite中的主键最名称建议使用_id。
create table employee (
_id integer primary key autoincrement, /*主键,自增长*/
name varchar, /*字符串*/
salary double, /*小数*/
birthday date /*日期, 可直接插入日期格式字符串*/
)
6 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
7 相关API
7.1 SQLiteOpenHelper: 数据库操作的抽象帮助类
// 构造方法, 指定数据库文件名和版本号
SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
// 用于创建表
abstract void onCreate(SQLiteDatabase db)
// 用于版本更新
abstract void onUpgrade()
// 得到数据库连接
SqliteDatabase getReadableDatabase()
7.2 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): 得到数据库连接
7.3 Cursor : 包含所有查询结果记录的结果集对象(光标,游标)
int getCount() : 匹配的总记录数
boolean moveToNext() : 将游标移动到下一条记录的前面
Xxx getXxx(columnIndex) : 根据字段下标得到对应值
int getColumnIndex(columnname): 根据字段名得到对应的下标
测试用例
数据库的创建
数据库的版本更新
表数据的CRUD
数据库事务
DBHelper.java
package com.shenju.test010_sp.helper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* DB数据库的帮助类
* @author SJ-001
*
*/
public class DBHelper extends SQLiteOpenHelper{
/**
* * 什么时候才会创建DB文件:(1)文件不存在的时候 (2)连接数据库
* @param context
* @param name
* @param factory
* @param version
*/
public DBHelper(Context context,int version) {
super(context,"wuk.db", null, version);
}
/**
* 创建文件时候调用一次
* 获取连接的时候会调用一次
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG","进入创建方法。。。。");
//创建表
String sql="create table person(_id integer primary key autoincrement,name varchar, age int)";
db.execSQL(sql);
//插入一些初始化数据
db.execSQL("insert into person (name, age) values ('Tom1', 11)");
db.execSQL("insert into person (name, age) values ('Tom2', 12)");
db.execSQL("insert into person (name, age) values ('Tom3', 13)");
}
//当传入的版本号大于数据库的版本号时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("TAG","进入版本更新方法。。。");
}
}
DBActivity.java
package com.shenju.test010_sp;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.shenju.test010_sp.helper.DBHelper;
import com.shenju.test010_sp.model.Person;
/**
* 数据库存储
* 应用:应用运行需要保存一系列有一定结构的数据
* 保存路径:数据保存的路径: /data/data/projectPackage/databases/xxx.db
* 默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作
* 应用卸载时会删除此数据
* @author SJ-001
*
*/
public class DBActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db);
}
/**
* 创建数据库
* @param v
*/
public void testCreateDB(View v){
DBHelper dbHelper=new DBHelper(this,1);
//获取连接
SQLiteDatabase database=dbHelper.getReadableDatabase();
Toast.makeText(this,"数据库创建完成",0).show();
}
/**
* 更新数据库版本
* @param v
*/
public void testUpdateDB(View v){
DBHelper dbHelper=new DBHelper(this,2);
//获取连接
SQLiteDatabase database=dbHelper.getReadableDatabase();
Toast.makeText(this, "数据库版本更新完毕",0).show();
}
/**
* 插入操作
* @param v
*/
public void testInsert(View v){
DBHelper dbHelper=new DBHelper(this,2);
//获取连接
SQLiteDatabase database= dbHelper.getReadableDatabase();
ContentValues cv=new ContentValues();
cv.put("name", "wuk");
cv.put("age", 24);
long count=database.insert("person",null,cv);
database.close();
Toast.makeText(this, "插入完成,插入"+count+"行",0).show();
}
/**
* 数据库数据更新
* @param v
*/
public void testUpdate(View v){
DBHelper dbHelper=new DBHelper(this, 2);
SQLiteDatabase sQLiteDatabase = dbHelper.getReadableDatabase();
ContentValues cv=new ContentValues();
cv.put("name", "jack");
cv.put("age", 19);
sQLiteDatabase.update("person",cv, "_id=?",new String[]{"4"});
sQLiteDatabase.close();
Toast.makeText(this, "数据修改成功",0).show();
}
/**
* 删除数据
* @param v
*/
public void testDelete(View v){
DBHelper dbHelper =new DBHelper(this,2);
SQLiteDatabase database= dbHelper.getReadableDatabase();
long count=database.delete("person","_id=?", new String[]{"2"});
database.close();
Toast.makeText(this, "数据删除条数为"+count+"条",0).show();
}
/*
查询
*/
public void testQuery(View v){
DBHelper dbHelper =new DBHelper(this, 2);
SQLiteDatabase database= dbHelper.getReadableDatabase();
Cursor cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);
int count=cursor.getCount();
Log.e("TAG", "查询到的条数为"+count);
List<Person> lists=new ArrayList<Person>();
while(cursor.moveToNext()){
Long _id=cursor.getLong(0);
String name=cursor.getString(0);
Integer age= cursor.getInt(2);
Person person=new Person();
person.set_id(_id);
person.setName(name);
person.setAge(age);
lists.add(person);
}
cursor.close();
database.close();
// 4. 提示
Toast.makeText(this, "查询结果为count=" + count+"条", 1).show();
}
}
/*
* 测试事务处理
* update person set age=16 where _id=1
* update person set age=17 where _id=3
*
* 一个功能中对数据库进行的多个操作: 要就是都成功要就都失败
* 事务处理的3步:
* 1. 开启事务(获取连接后)
* 2. 设置事务成功(在全部正常执行完后)
* 3. 结束事务(finally中)
*/
public void testTransaction(View v) {
SQLiteDatabase database = null;
try{
DBHelper dbHelper = new DBHelper(this, 2);
database = dbHelper.getReadableDatabase();
//1. 开启事务(获取连接后)
database.beginTransaction();
//执行update update person set age=16 where _id=1
ContentValues values = new ContentValues();
values.put("age", 16);
int updateCount = database.update("person", values , "_id=?", new String[]{"1"});
Log.e("TAG", "updateCount="+updateCount);
//出了异常
boolean flag = true;
if(flag) {
throw new RuntimeException("出异常啦!!!");
}
//执行update update person set age=17 where _id=3
values = new ContentValues();
values.put("age", 17);
int updateCount2 = database.update("person", values , "_id=?", new String[]{"3"});
Log.e("TAG", "updateCount2="+updateCount2);
//2. 设置事务成功(在全部正常执行完后)
database.setTransactionSuccessful();
} catch(Exception e) {
e.printStackTrace();
Toast.makeText(this, "出异常啦!!!", 1).show();
} finally {
//3. 结束事务(finally中)
if(database!=null) {
database.endTransaction();
database.close();
}
}
}
注意:
只要没有执行到设置事务成功就会事务回滚。