现在的位置: 首页 > 综合 > 正文

android轻量型数据库sqlite的使用方法汇总

2014年01月01日 ⁄ 综合 ⁄ 共 9153字 ⁄ 字号 评论关闭

声明:主要是对sqlite的使用做一下简单的汇总。

首先建立数据库和建立数据表

/**
 * @FILE:DBOpenHelper.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:06:29
 **/
package com.yehui.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

/*******************************************
 * 
 * @CLASS:DBOpenHelper
 * @DESCRIPTION:sqlite数据库必须继承SQLiteOpenHelper(抽象类)
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:06:29
 *******************************************/
public class DBOpenHelper extends SQLiteOpenHelper {

	/**
	 * create a instance DBOpenHelper.
	 * 
	 * @param context
	 *            上下文对象
	 * @param name
	 *            数据库名称
	 * @param factory
	 *            CursorFactory
	 * @param version
	 *            版本号(第一次生成数据库时,版本号是1,只执行一次)
	 */
	public DBOpenHelper(Context context) {
		super(context, "yehui.db", null, 1);

	}

	/*
	 * (non-Javadoc)当创建数据库的时候就会创建下面的表,可以在这里创建多张表:表中的字段的类型可以完全没有,
	 * varchar(20)长度并不能限制。可以输入超过20字符的长度。
	 * 
	 * @see
	 * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite
	 * .SQLiteDatabase)
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table person(personid integer primary key autoincrement, name varchar(20))";
		// 执行这句sql
		db.execSQL(sql);
	}

	/*
	 * (non-Javadoc)对数据库更新,可以在这个方法里面对数据表做alter.:也就是说当 super(context, "yehui.db",
	 * null, 1);这里面的版本号发生改变的时候就会调用这个方法,执行完成后将数据库的版本号设置为新的版本号
	 * 
	 * @see
	 * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite
	 * .SQLiteDatabase, int, int)
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String sql = "ALTER TABLE PERSON ADD PHONE VARCHAR(12) NULL";
		db.execSQL(sql);
	}

}

其次,为了方法建立一个bean来对应表中的内容:

/**
 * @FILE:Person.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:31:18
 **/
package com.yehui.entity;

/*******************************************
 * 
 * @CLASS:Person
 * @DESCRIPTION:bean
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:31:18
 *******************************************/
public class Person {
	private Integer id;
	private String name;
	private String phone;

	public Person(String name, String phone) {
		this.name = name;
		this.phone = phone;
	}

	public Person(Integer id, String name, String phone) {
		super();
		this.id = id;
		this.name = name;
		this.phone = phone;
	}

	public Person() {
		super();
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public static void main(String[] args) {
		Person person = new Person("yehui", "132");
		System.out.println(person.toString());
	}
}

再次:建立一个service类来处理业务逻辑(注意两种不同的操作方法使用sql的不同)

/**
 * @FILE:PersonService.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:41:47
 **/
package com.yehui.service;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.yehui.entity.Person;

/*******************************************
 * 
 * @CLASS:PersonService
 * @DESCRIPTION:对person进行增删改查操作
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:41:47
 *******************************************/
public class PersonService {
	private DBOpenHelper dbOpenHelper;
	public final static String TAG = "PersonService";

	/**
	 * create a instance PersonService. 会创建数据库
	 * 
	 * @param context
	 */
	public PersonService(Context context) {
		super();
		this.dbOpenHelper = new DBOpenHelper(context);
	}

	/**
	 * @description:保存
	 * @author:Administrator
	 * @return:void
	 * @param person
	 */

	public void save(Person person) {
		// 如果数据表不存在先创建数据表,存在,则不创建
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// SQLiteDatabase db1 = dbOpenHelper.getWritableDatabase();这个和
		// SQLiteDatabase db是同一个对象
		// 方法1
		// 使用?。参数形式
		// db.execSQL("insert into person(name,phone) values(?,?)", new Object[]
		// {
		// person.getName(), person.getPhone() });
		// 或者使用sqlite自带的操作方法
		// 方法2
		ContentValues values = new ContentValues();
		values.put("name", person.getName());
		values.put("phone", person.getPhone());
		db.insert("person", null, values);
		// 注意这里的第二个参数(表的字段名)。db.insert("person", "personid",
		// null);也就说新增一条纪录,id是null:这个语句不会报错,只会按自增的id新增一条纪录
	}

	/**
	 * @description:按照id删除数据
	 * @author:Administrator
	 * @return:void
	 * @param id
	 */

	public void delete(Integer id) {
		// 如果数据表不存在先创建数据表,存在,则不创建
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 方法1
		// 使用?。参数形式
		// db.execSQL("delete from person where personid=?", new Object[] { id
		// });
		// 方法2
		db.delete("person", "personid=?", new String[] { id.toString() });
	}

	public void update(Person person) {
		// 如果数据表不存在先创建数据表,存在,则不创建
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 方法1
		// 使用?。参数形式
		// db.execSQL("update  person set name=?,phone=? where personid=? ", new
		// Object[] { person.getName(),person.getPhone(),person.getPersonid()
		// });
		// 方法2
		ContentValues values = new ContentValues();
		values.put("name", person.getName());
		values.put("phone", person.getPhone());
		db.update("person", values, "personid=?", new String[] { person.getId()
				.toString() });
	}

	/**
	 * @description:依照id查找数据
	 * @author:Administrator
	 * @return:Person
	 * @param id
	 * @return
	 */

	public Person find(Integer id) {
		Person person = null;
		// 如果数据表不存在先调用getReadableDatabase方法,存在,则不创建
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// 方法1
		// 使用?。参数形式
		// Cursor cursor = db.rawQuery("select * from person where personid=?",
		// new String[] { id.toString() });
		// 方法2
		Cursor cursor = db.query("person", null, "personid=?",
				new String[] { id.toString() }, null, null, null);
		// 如果找到一个result,则返回result
		if (cursor.moveToFirst()) {
			person = new Person();
			person.setId(cursor.getColumnIndex("personid"));
			person.setName(cursor.getString(cursor.getColumnIndex("name")));
			person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));
		}
		Log.v(TAG, person.toString());
		cursor.close();
		return person;
	}

	/**
	 * @description:分页查询
	 * @author:Administrator
	 * @return:List<Person> 结果
	 * @param offset
	 *            跳过几条数据
	 * @param maxResult
	 *            总共查找几条数据
	 * @return
	 */

	public List<Person> getScrollData(Integer offset, int maxResult) {
		List<Person> persons = new ArrayList<Person>();
		// 如果数据表不存在先调用getReadableDatabase方法,存在,则不创建
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// 方法1
		// 使用?。参数形式
		// Cursor cursor = db.rawQuery(
		// "select * from person order by personid asc limit ?,?",
		// new String[] { String.valueOf(offset),
		// String.valueOf(maxResult) });
		// 方法2
		Cursor cursor = db.query("person", null, null, null, null, null,
				"personid asc", offset + "," + maxResult);
		// 循环将结果加入到list中
		while (cursor.moveToNext()) {
			Person person = new Person();
			person.setId(cursor.getColumnIndex("personid"));
			person.setName(cursor.getString(cursor.getColumnIndex("name")));
			person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));
			persons.add(person);
		}
		cursor.close();
		// Log.v(TAG, person.toString());
		return persons;
	}

	/**
	 * @description:获得纪录的总数
	 * @author:Administrator
	 * @return:long
	 * @return
	 */

	public long getCount() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// 方法1
		// Cursor cursor = db.rawQuery("select count(*) from person", null);
		// 方法2
		Cursor cursor = db.query("person", new String[] { "count('*')" }, null,
				null, null, null, null, null);
		cursor.moveToFirst();
		// 取得第一个字段的所有记录数
		long count = cursor.getLong(0);
		cursor.close();
		Log.v(TAG, "纪录总数" + count);
		return count;
	}
}

最后使用单元测试来测试功能:

/**
 * @FILE:DBTest.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午11:52:06
 **/
package com.yehui.db;

import java.util.List;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.test.AndroidTestCase;
import android.view.Menu;

import com.yehui.entity.Person;
import com.yehui.service.DBOpenHelper;
import com.yehui.service.PersonService;

/*******************************************
 * 
 * @CLASS:DBTest
 * @DESCRIPTION:sqlite单元测试必须继承AndroidTestCase
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午11:52:06
 *******************************************/
public class DBTest extends AndroidTestCase  {
	private DBOpenHelper dbOpenHelper;
	private SQLiteDatabase sqliteDatabase;
	public void createDB() {
		dbOpenHelper = new DBOpenHelper(this.getContext());
		// 创建数据表
		sqliteDatabase = dbOpenHelper.getWritableDatabase();
	}

	public void save() {
		PersonService personService = new PersonService(
				this.getContext());
		Person person = new Person("zhangxueyou", "123456");
		personService.save(person);
	}

	public void delete() {
		PersonService personService = new PersonService(
				this.getContext());
		personService.delete(2);
	}

	public void update() {
		PersonService personService = new PersonService(
				this.getContext());
		Person person = personService.find(1);
		person.setName("guofucheng");
		personService.update(person);
	}

	public Person find() {
		PersonService personService = new PersonService(
				this.getContext());
		Person person = personService.find(1);
		return person;
	}

	public List<Person> getScrollData() {
		PersonService personService = new PersonService(
				this.getContext());
		List<Person> persons = personService.getScrollData(0, 2);
		return persons;
	}

	public long getCount() {
		PersonService personService = new PersonService(
				this.getContext());
		long count = personService.getCount();
		return count;
	}
}

好了,总结就这么多了。

补充一点,sqlite事物处理:

SqliteDatabase db=dbOpenHelper.getReadableDatabase();

//开始事物

db.beginTransaction();

try{

  sql语句;

  sql语句;

//提交事物

db.setTransactionSuccessful();

}catch(Exception e){

}finally{

//结束事物

db.endTransaction();

}

下面添加复杂查询的方法,简单的将两个表进行关联:等价于(inner join)

先声明一个SQLiteQueryBuilder对象。

SQLiteQueryBuilder queryBuilder=new SQLiteQueryBuilder();

//设置需要关联的表

queryBuilder.setTables("tb1,tb2");

//添加表关联的条件:

queryBuilder.appendWhere(ta1.id=tb2.id);

//需要出现的列元素

String asColumnsToReturn[]={t1.title,t1.name,t2.age,address};

//排序条件

String strSortOrder="title ASC";

Cursor c=queryBuilder.query(db,asColumnsToReturn,null,null,null,null,strSortOrder);

抱歉!评论已关闭.