android 数据操作之SQLite

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(); // 内容的值的集合

具体的类(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 
android 数据操作之SQLite_第1张图片

添一张查询结果数据的图吧:


也可以在dos命令下进入linux 控制后台。查询sqlite3数据。
第一步:我们需要进行android-sdk-windows 的目录下。再进入tools 或platform-tools 查询adb.exe 
android 数据操作之SQLite_第2张图片
注:由于 版本的不同adb.exe 在不同的目录下。
具体见下图:
android 数据操作之SQLite_第3张图片 android 数据操作之SQLite_第4张图片

如果数据库中有中文,会有问题是数据编码问题。

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);
		}
	}
}


你可能感兴趣的:(android 数据操作之SQLite)