SQLite 是android 嵌入式数据库,是典型的关系型数据库,支持我们常用的数据类型,支持标准的sql语句。
SQLite 在嵌入式数据库中经常使用,如词霸中就在sqlite3.dll ,是一个单一文件,不需要安装,就可以直接使用。
在android 系统中我们需要extends 一个抽象类SQLiteOpenHelper 实现它默认的方法。
- public void onCreate(SQLiteDatabase db) {} 应用到首次使用时创建数据库及表结构
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}是软件数据库版本更新时调用的方法,注意数据不就应该丢失。
Android 项目中使用SQLiter 数据库
第一步:编写一个实体类要继承 SQLiteOpenHelper
第二步:给这个实体类添加一个构造器(必须)
第三步:重写onCreate(SQLiteDatabase db); 第一次使用数据库时创建表结构。
重写onUpgrade(SQLiteDatabase db,in oldVersion,int newVersion);在数据库升级时重新创建数据库。
第四步:常用代码。
SQLiteDatabase db = this.getReadableDatabase(); 获取一个可读的数据库。
SQLiteDatabase db = this.getWriteableDatabase();获取一个可写的数据库。
Cursor cursor = db.query(tableName,...);
ContentValues cv = new ContentValues(); // 内容的值的集合
第一步:编写一个实体类要继承 SQLiteOpenHelper
第二步:给这个实体类添加一个构造器(必须)
第三步:重写onCreate(SQLiteDatabase db); 第一次使用数据库时创建表结构。
重写onUpgrade(SQLiteDatabase db,in oldVersion,int newVersion);在数据库升级时重新创建数据库。
第四步:常用代码。
SQLiteDatabase db = this.getReadableDatabase(); 获取一个可读的数据库。
SQLiteDatabase db = this.getWriteableDatabase();获取一个可写的数据库。
Cursor cursor = db.query(tableName,...);
ContentValues cv = new ContentValues(); // 内容的值的集合
具体的类(CRUD)实现如下:
package com.hkrt.server;
import java.util.ArrayList;
import java.util.List;
import com.hkrt.domain.Person;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class PersonHelper extends SQLiteOpenHelper {
private static final String DBNAME="hkrt.db";
private static final String TABLENAME="person";
private static final String ID="id";
private static final String NAME="name";
private static final Integer VERSION=1;
public PersonHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table "+TABLENAME+" ("+ID+" INTEGER primary key autoincrement,"+NAME+" varchar(20))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
// 添加数据到指定的数据库表中
public long insert(String text){
SQLiteDatabase db =this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NAME, text);
long row = db.insert(TABLENAME, null, values);
return row;
}
//修改指定的数据库表数据
public long update(int id){
SQLiteDatabase db =this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NAME, "李四");
String where = ID + " = ?";
String[] whereValue = { Integer.toString(id) };
long row= db.update(TABLENAME, values, where, whereValue);//返回受影响的行数标识
return row;
}
//删除指定数据库中的表数据记录
public long delete(int id){
SQLiteDatabase db = this.getWritableDatabase();
String whereClause=ID+"=?";
String[] whereArgs = { Integer.toString(id) };
long row = db.delete(TABLENAME, whereClause, whereArgs);
return row;
}
//查询列表数据
public List<Person> find(){
List<Person> list = new ArrayList<Person>();
Person person;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.query(TABLENAME, null, null, null, null, null, null);
while(cursor.moveToNext()){
person= new Person();
int id = cursor.getInt(0);
String name = cursor.getString(1);
person.setId(id);
person.setName(name);
if(person!=null){
list.add(person);
}
}
cursor.close();
db.close();
return list;
}
}
测试代码:
package com.hkrt.db;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.hkrt.domain.Person;
import com.hkrt.server.PersonHelper;
public class PersonTest extends AndroidTestCase {
String TAG="PersonTest";
public void testCreateDB(){
PersonHelper helper = new PersonHelper(this.getContext());
// helper.getWritableDatabase();// 创建数据库
System.out.println(helper.insert("格林斯"));
Log.i(TAG,String.valueOf(helper.insert("google")));//插入新的数据
// System.err.println(helper.update(1));//更新数据
// System.err.println(helper.delete(1));//删除数据
List<Person> persons = helper.find();//查询所有数据
for(Person p:persons){
System.err.println(p.toString());
}
// 分页查询是使用和mysql 相同,关键字limit
}
}
通常我们做CUD 时,要做事务的处理:
// 添加数据到指定的数据库表中
public long insert(String text){
SQLiteDatabase db =this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NAME, text);
db.beginTransaction();//开始事务
long row;
try{
row = db.insert(TABLENAME, null, values);
db.setTransactionSuccessful();
}finally{
db.endTransaction();
}
return row;
}
生成的数据库在\data\data\<package.name>\databases\ 下。
可以把生成的数据库导出,查看其结构和数据,这里推荐一个sqlite 工作, sqlite develoption
添一张查询结果数据的图吧:
也可以在dos命令下进入linux 控制后台。查询sqlite3数据。
第一步:我们需要进行android-sdk-windows 的目录下。再进入tools 或platform-tools 查询adb.exe
注:由于 版本的不同adb.exe 在不同的目录下。
具体见下图:
如果数据库中有中文,会有问题是数据编码问题。
android sqlite3 工具类可以直接修改并使用。
package com.hkrt.sql;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import com.hkrt.domain.User;
import com.hkrt.domain.UserEnum;
/**
* 使用方式:</br>
* dbHelper = new DBHelper(this);</br>
* dbHelper.open();</br>
* 处理数据</br>
* dbHelper.close()</br>
* @data 2010-11-12
*/
public class DBHelper
{
//sqlite支持NULL Integer real text blob类型,注意该类的所有数据库操作的异常都没有处理
private Context context;
private SQLiteDatabase dbInstance;
private DBCreator dbCreator;
private static final String DB_NAME = "db_user";
private static final int DB_VERSION = 1;
public static final String TABLE_NAME="user";
public static final String COLUMN_ID = "user_id";
public static final String COLUMN_NAME="user_name";
public static final String COLUMN_AGE="user_age";
public static final String COLUMN_SEX="user_sex";
public static final String COLUMN_TYPE = "user_type";
private static final String CREATE_TABLE= new StringBuffer().append("Create table ").append(TABLE_NAME)
.append(" (")
.append(COLUMN_ID).append(" integer primary key,")
.append(COLUMN_NAME).append(" varchar(20) not null,")
.append(COLUMN_AGE).append(" text not null,")
.append(COLUMN_SEX).append(" text not null,")
.append(COLUMN_TYPE).append(" integer not null)")
.toString();
public DBHelper(Context context)
{
this.context = context;
}
public void open()
{
//第一次,android系统发现数据库没有创建,会调用onCreate方法,以后就只是返回数据库的一个引用
dbCreator = new DBCreator(context,DB_NAME,null,DB_VERSION,CREATE_TABLE,TABLE_NAME);
dbInstance = dbCreator.getWritableDatabase();
}
public void close()
{
dbCreator.close();
}
public void insert(ContentValues values)
{
dbInstance.insert(TABLE_NAME, null, values);
}
public void update(ContentValues values,String whereClause,String[] whereArgs)
{
dbInstance.update(TABLE_NAME, values, whereClause, whereArgs);
}
public void delete(String whereClause, String[] whereArgs)
{
dbInstance.delete(TABLE_NAME, whereClause, whereArgs);
}
/**
* 查询
* @param sql SQL语句,参数用?占位
* @param selectionArgs 参数?的值数组
* @return Cursor游标,注意,和JDBC的ResultSet一样,是在线数据集,所以处理完之前,不能调用close()
*/
public Cursor query(String sql, String[] selectionArgs)
{
return dbInstance.rawQuery(sql, selectionArgs);
}
public ArrayList<User> getQueryAccountList(String sql,String[] args)
{
ArrayList<User> accoutList = new ArrayList<User>();
open();
Cursor cursor = query(sql, args);
while (cursor.moveToNext()) {
User user = new User();
user.setId(cursor.getInt(0));
user.setName(cursor.getString(1));
user.setAge(cursor.getString(2));
user.setSex(cursor.getString(3));
user.setType(UserEnum.getUserEnum(cursor.getInt(4)));
accoutList.add(user);
}
//注意游标必须要关闭,否则多查询几次就会出现异常
if(!cursor.isClosed())
{
cursor.close();
}
close();
return accoutList;
}
/**通过Id获取唯一user*/
public User getUserById(int id){
User user =null;
String sql="select * from "+TABLE_NAME +" where " + COLUMN_ID +" = ?";
ArrayList<User> users = getQueryAccountList(sql,new String[]{String.valueOf(id)});
if(users!=null){
user= new User();
user.setId(users.get(0).getId());
user.setName(users.get(0).getName());
user.setAge(users.get(0).getAge());
user.setSex(users.get(0).getSex());
user.setType(users.get(0).getType());
}
return user;
}
/**
* 模糊查询
*/
public ArrayList<User> getQueryAccountListLike(String str){
ArrayList<User> accoutList = new ArrayList<User>();
open();
StringBuffer sb = new StringBuffer();
sb.append("select * from ").append(TABLE_NAME).append(" where ").append(COLUMN_NAME).append(" like ").append("'"+str +"%'");
Cursor cursor = dbInstance.rawQuery(sb.toString(), new String[]{});
while (cursor.moveToNext()) {
User user = new User();
user.setId(cursor.getInt(0));
user.setName(cursor.getString(1));
user.setAge(cursor.getString(2));
user.setSex(cursor.getString(3));
user.setType(UserEnum.getUserEnum(cursor.getInt(4)));
accoutList.add(user);
}
//注意游标必须要关闭,否则多查询几次就会出现异常
if(!cursor.isClosed())
{
cursor.close();
}
close();
return accoutList;
}
private class DBCreator extends SQLiteOpenHelper
{
private Context context;
private String createTableSql;
private String tableName;
public DBCreator(Context context, String dbname, CursorFactory factory,
int version,String createTableSql,String tableName)
{
super(context, dbname, factory, version);
this.context = context;
this.createTableSql = createTableSql;
this.tableName = tableName;
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(createTableSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("drop table if exists "+tableName);
onCreate(db);
}
}
}