声明:主要是对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);