andorid SQLite 的使用详解
1、创建数据库
a、编写一个类 DBHelper 继承 SQLiteOpenHelper。
b、重写 SQLiteOpenHelper的三个方法:onCreate(第一次创建的时候调用此方法),onUpgrade(更新的
时候调用此方法:参数newVersion 大于 oldBersion时调用),onOpen(每次打开数据库文件时调用)。
c、在 onCreate 方法中创建一个新的数据库文件:
String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execSQL(sql);
2、创建数据库的管理类,封装对数据库的增删查找操作。
对数据库进行操作有两种方法:
1、通过SQLiteDatabase调用execSQL方法执行SQLite语言。
/**
* 实现对数据库的添加 删除 修改
*
* @param sql
* @param bindArgs
* @return
*/
public boolean updataBySQL(String sql, Object[] bindArgs) {
boolean falg = false;
database = dbHelper.getWritableDatabase();
try {
database.execSQL(sql, bindArgs);
falg = true;
} catch (Exception e) {
// TODO: handle exception
}
database.close();
return falg;
}
/**
* 单条记录查询
*
* @param sql
* @param selectionArgs
* @return
*/
public Map queryBySQL(String sql, String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
Map map = new HashMap();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int cols_len = cursor.getColumnCount();// 列的个数
while (cursor.moveToNext()) {
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
database.close();
return map;
}
/**
* 查找多条记录
*
* @param sql
* @param selectionArgs
* @return
*/
public List
2、通过调用SQLiteDatabase子方法实现对数据库的编辑。
/**
* 插入数据
*
* @param table
* 表名
* @param nullColumnHack
* 如果第三个参数values 为Null或者元素个数为0,
* 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
* insert语句必须给定一个字段名,如:insert into person(name)
* values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
* values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
* 执行类似insert into person(personid)
* values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
* 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
* @param values
* 修改后的值 new一个ContentValues中,再添加
* @return
*/
public boolean insert(String table, String nullColumnHack,
ContentValues values) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.insert(table, nullColumnHack, values);
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 更新数据,修改数据 update person set name = ?, address=? where pid = ?
*
* @param table
* 表名
* @param values
* 对应的值
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/
public boolean update(String table, ContentValues values,
String whereClause, String[] whereArgs) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 删除 delete from person where pid = ?
*
* @param table
* 表名
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/
public boolean delete(String table, String whereClause, String[] whereArgs) {
boolean flag = false;
database = dbHelper.getWritableDatabase();
long id = database.delete(table, whereClause, whereArgs);
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
* [where][selection][selectionArgs
* ][selectionArgs][groupBy][having][orderBy][limit];
*
* @param distinct
* 去掉重复的记录
* @param table
* 表名
* @param columns
* 列名
* @param selection
* 查询的过滤条件
* @param selectionArgs
* 过滤条件的值
* @param groupBy
* 分组
* @param having
* 对分组进行过滤的条件
* @param orderBy
* 排序
* @param limit
* 分页
* @return
*/
public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
database = dbHelper.getWritableDatabase();
Cursor cursor = null;
cursor = database.query(distinct, table, columns, selection,
selectionArgs, groupBy, having, orderBy, limit);
return cursor;
}
两种方法对数据库的操作是一样的,第一种方法适合熟悉SQLite语言的人使用,第二种对SQLite语言不熟悉的人也可以使用。
对数据库操作结束后应当关闭数据库:
/**
* 关闭数据库
*/
public void close_SQLite() {
if (database != null) {
database.close();
}
}
将数据库操作封装后,以后操作数据库只要调用该包就可以,方便快捷。
目录结构:
MainActivity类代码:
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
DBHelper类代码:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {// 创建,打开,管理数据库
private static final String DB_NAME = "mydb.db"; // 数据库名字
private static final int VERSION = 1; // 数据库版本
public DBHelper(Context context) {
super(context, DB_NAME, null, VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 数据库建表语句
String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execSQL(sql);
}
// 更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
//打开数据库
@Override
public void onOpen(SQLiteDatabase db) {
// TODO Auto-generated method stub
super.onOpen(db);
}
}
DBManager 类代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DBManager {
private DBHelper dbHelper;
private SQLiteDatabase database;
public DBManager(Context context) {
// TODO Auto-generated constructor stub
dbHelper = new DBHelper(context);
}
/**
* 实现对数据库的添加 删除 修改
*
* @param sql
* @param bindArgs
* @return
*/
public boolean updataBySQL(String sql, Object[] bindArgs) {
boolean falg = false;
database = dbHelper.getWritableDatabase();
try {
database.execSQL(sql, bindArgs);
falg = true;
} catch (Exception e) {
// TODO: handle exception
}
database.close();
return falg;
}
/**
* 单条记录查询
*
* @param sql
* @param selectionArgs
* @return
*/
public Map queryBySQL(String sql, String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
Map map = new HashMap();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int cols_len = cursor.getColumnCount();// 列的个数
while (cursor.moveToNext()) {
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
database.close();
return map;
}
/**
* 查找多条记录
*
* @param sql
* @param selectionArgs
* @return
*/
public List> queryMultiMaps(String sql,
String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
List> list = new ArrayList>();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int csls_len = cursor.getColumnCount();
while (cursor.moveToNext()) {// 游标移动到下一个,不为0
Map map = new HashMap();
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
database.close();
return list;
}
// -----------使用SQLiteDatabase中方法对数据库进行操作----------
/**
* 插入数据
*
* @param table
* 表名
* @param nullColumnHack
* 如果第三个参数values 为Null或者元素个数为0,
* 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
* insert语句必须给定一个字段名,如:insert into person(name)
* values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
* values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
* 执行类似insert into person(personid)
* values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
* 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
* @param values
* 修改后的值 new一个ContentValues中,再添加
* @return
*/
public boolean insert(String table, String nullColumnHack,
ContentValues values) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.insert(table, nullColumnHack, values);
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 更新数据,修改数据 update person set name = ?, address=? where pid = ?
*
* @param table
* 表名
* @param values
* 对应的值
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/
public boolean update(String table, ContentValues values,
String whereClause, String[] whereArgs) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 删除 delete from person where pid = ?
*
* @param table
* 表名
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/
public boolean delete(String table, String whereClause, String[] whereArgs) {
boolean flag = false;
database = dbHelper.getWritableDatabase();
long id = database.delete(table, whereClause, whereArgs);
flag = id > 0 ? true : false;
database.close();
return flag;
}
/**
* 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
* [where][selection][selectionArgs
* ][selectionArgs][groupBy][having][orderBy][limit];
*
* @param distinct
* 去掉重复的记录
* @param table
* 表名
* @param columns
* 列名
* @param selection
* 查询的过滤条件
* @param selectionArgs
* 过滤条件的值
* @param groupBy
* 分组
* @param having
* 对分组进行过滤的条件
* @param orderBy
* 排序
* @param limit
* 分页
* @return
*/
public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
database = dbHelper.getWritableDatabase();
Cursor cursor = null;
cursor = database.query(distinct, table, columns, selection,
selectionArgs, groupBy, having, orderBy, limit);
return cursor;
}
/**
* 关闭数据库
*/
public void close_SQLite() {
if (database != null) {
database.close();
}
}
}
使用单元测试的测试代码(使用单元测试前不要忘记在清单文件中添加单元测试):
import java.util.List;
import java.util.Map;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
public class myTset extends AndroidTestCase {
// 创建数据库
public void initTable() {
DBHelper manage_SQLite = new DBHelper(getContext());
SQLiteDatabase sqLiteDatabase = manage_SQLite.getReadableDatabase();// manage_SQLite.getWritableDatabase();
// 调用这两个方法之一数据库才会创建
}
public void insert() { // 添加
String sql = "insert into person(name,address) values(?,?)";
Object[] bin = { "光电科技股份有限公司", "长沙" };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}
public void update() { // 修改 更新 把 pid等于4的行,name 更新成 "郭jian凯",address修改成"长沙"
String sql = "update person set name = ?, address=? where pid = ?";
Object[] bin = { "郭凯", "长沙", 4 };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}
public void delete() { // 删除 删除 pid等于4的行
String sql = "delete from person where pid = ?";
Object[] bin = { 4 };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}
public void query1() {// 查询单条记录
String sql = "select * from person where pid = ?";
DBManager manager = new DBManager(getContext());
Map map = manager.queryBySQL(sql, new String[] { "2" });
System.out.println("-->>" + map.get("name"));
System.out.println("-->>" + map.get("address"));
}
public void query2() {// 查询多条记录 查找出 name 列包含 “郭”的行
String sql = "select * from person where name like ?";
DBManager manager = new DBManager(getContext());
List> list = manager.queryMultiMaps(sql,
new String[] { "%郭%" });
for (Map map2 : list) {
System.out.println("-->>" + map2.get("name"));
System.out.println("-->>" + map2.get("address"));
}
}
// -----------使用SQLiteDatabase 的方法操作数据库--------
public void insert1() { // 添加
// 添加数据 使用SQLiteDatabase带的方法
DBManager manager = new DBManager(getContext());
ContentValues cOntentValues= new ContentValues();
contentValues.put("name", "ss");
contentValues.put("address", "sss沙");
manager.insert("person", null, contentValues);
}
public void update2() { // 修改 更新 将表“person”中pid = 4的行,中内容修改成 contentValues的值
DBManager manager = new DBManager(getContext());
ContentValues cOntentValues= new ContentValues();
contentValues.put("name", "修改");
contentValues.put("address", "修改");
manager.update("person", contentValues, "pid = ?", new String[] { "5" });
}
public void delete2() { // 删除 删除 pid等于2 的行
DBManager manager = new DBManager(getContext());
manager.delete("person", "pid = ?", new String[] { "2" });
}
public void query() { // 查找
DBManager manager = new DBManager(getContext());
Cursor cursor = manager.query(false, "person", null, null, null, null,
null, null, null);
while (cursor.moveToNext()) {
System.out.println("--query->>"
+ cursor.getString(cursor.getColumnIndex("name")));
}
manager.close_SQLite();// 关闭数据库
}
}
http://blog.csdn.net/q296264785/article/details/53172873