1 业务类 sqlite版本管理类
package it.service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
*
* 数据库版本控制类
* SQLiteOpenHelper是一个数据库版本的控制超类
*
*/
public class MangerDatabase extends SQLiteOpenHelper {
private static final String name="shool";
private static final int version=2;
/**
*
* @param context 上下文信息
* @param name 数据库名称
* @param CursorFactory factory 游标工厂
* @param version 数据库版本
* 执行数据参数的初始化工作
*/
public MangerDatabase(Context context) {
//调用超类的构造方法
super(context, name, null, version);
}
/**
* 如果没有数据库中没有此表 就创建表结构 覆写超类的创建的方法
* 这个方法在超类中是一个只有方法体没有实现体的
* onCreate 创建方法 在用户执行调用获取用户数据库管理时例就已经执行
* 此方法是超类存在的 并且由 getWritableDatabase()这个方法调用的
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), age INTEGER,xxx INTEGER)");
}
/**
* 执行更新 如果表存在 将执行更新操作
* oldVersion 老版本号
* newVersio 新版本号
* onUpgrade 创建方法 在用户执行调用获取用户数据库管理时例就已经执行
* 此方法是超类存在的 并且由 getWritableDatabase()这个方法调用的
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//先删除
db.execSQL("DROP TABLE IF EXISTS person");//
//调用方法执行创建
onCreate(db);
}
}
2 业务类一
package it.service;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import it.bean.Person;
/**
*
* 实体操作类
* rawQuery 执行sql查询
* execSQL 执行增删 改的sql
* 由SQLiteOpenHelper 的继承类 MangerDatabase获取数据库管理实例
* 由SQLiteDatabase的对象去获取这个管理实例
* 这个对象可以执行rawQuery和execSQL方法
*/
public class PersonService {
private MangerDatabase dbmanger;
public PersonService(Context context) {
dbmanger=new MangerDatabase(context);
}
//保存
public void save(Person person){
/**
* 打开数据库 取得数据操作对象
* getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
* 但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
* 倘若使用的是getWritableDatabase() 方法就会出错。
* getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败
* 当打开失败后会继续尝试以只读方式打开数据库。
* SQLiteDatabase sqlite数据库的管理类
*/
SQLiteDatabase database= dbmanger.getWritableDatabase();
database.execSQL("insert into person(name,age) values(?,?)",new Object[]{person.getName(),person.getAge()});
}
//更新
public void update(Person person)
{
SQLiteDatabase database= dbmanger.getWritableDatabase();
//execSQL是执行sql语句
database.execSQL("update person set name=?,age=? where personid=?",new Object[]{person.getName(),person.getAge(),person.getPersonId()});
}
//根据id执行查询数据
public Person findbyid(Integer id)
{
SQLiteDatabase database= dbmanger.getWritableDatabase();
//Cursor是游标类 游标在数据库中其实就是一个数据集
Cursor cursor = database.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});
if(cursor.moveToNext()){
Log.i("xxx", "xxx"+String.valueOf(cursor.getInt(3)));
Person person=new Person(cursor.getInt(0),cursor.getString(1),cursor.getShort(2));
return person;
}
return null;
}
//删除
public void delete(Integer... ids)
{
if(ids.length>0){
StringBuilder sb = new StringBuilder();
for(Integer id : ids){
sb.append('?').append(',');
}
//删除最后一个字符
sb.deleteCharAt(sb.length()-1);
SQLiteDatabase database= dbmanger.getWritableDatabase();
//execSQL是执行sql语句
database.execSQL("delete from person where personid in("+sb+")",(Object[])ids);
}
}
//分页查询 一
public List<Person> getdatePerson(int startResult,int maxResult){
List<Person> persons=new ArrayList<Person>();
SQLiteDatabase database= dbmanger.getWritableDatabase();
//Cursor是游标类 游标在数据库中其实就是一个数据集
//rawQuery(String sql,String[]s) 参数一 是一个sql语句 参数二是参数一sql语句中条件的占位符所存的具体值,这些值是一个字符string数组
Cursor cursor = database.rawQuery("select * from person limit ?,?",
new String[]{String.valueOf(startResult), String.valueOf(maxResult)});
while(cursor.moveToNext()){
persons.add(new Person(cursor.getInt(0), cursor.getString(1), cursor.getShort(2)));
}
return persons;
}
//分页查询 二
public Cursor getdateRawPerson(int startResult,int maxResult){
// List<Person> persons=new ArrayList<Person>();
SQLiteDatabase database= dbmanger.getWritableDatabase();
//Cursor是游标类 游标在数据库中其实就是一个数据集
//rawQuery(String sql,String[]s) 参数一 是一个sql语句 参数二是参数一sql语句中条件的占位符所存的具体值,这些值是一个字符string数组
return database.rawQuery("select personid as _id,name,age from person limit ?,?",
new String[]{String.valueOf(startResult), String.valueOf(maxResult)});
}
//获取总记录数
public long getcount()
{
SQLiteDatabase database= dbmanger.getWritableDatabase();
//Cursor是游标类 游标在数据库中其实就是一个数据集
Cursor cursor = database.rawQuery("select count(*) from person", null);
if(cursor.moveToLast()){
return cursor.getLong(0);
}
return 0;
}
}
3 业务类二
package it.service;
import java.util.ArrayList;
import java.util.List;
import it.bean.Person;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* 此类不需要基于sql语句 进行增删查改操作
* 但是SQLiteDatabase对象是通过内部构造sql语句而执行操作的
*
*/
public class PersonSQLservice {
private MangerDatabase dbmanger;
public PersonSQLservice(Context context) {
dbmanger=new MangerDatabase(context);
}
public void save(Person person){
SQLiteDatabase database = dbmanger.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", person.getName());
values.put("age", person.getAge());
//参数 表名 构建insert语句的正确字段 字段映射
database.insert("person", "name", values);
}
public void update(Person person){
SQLiteDatabase database = dbmanger.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", person.getName());
values.put("age", person.getAge());
//参数 表名 更新映射关系 条件 占位符值
database.update("person", values, "personid=?" , new String[]{String.valueOf(person.getPersonId())});
}
public Person find(Integer id){
SQLiteDatabase database = dbmanger.getWritableDatabase();
//执行查询 参数 表名 返回的字段 指定条件 指定条件值 是否分组 分组条件 是否排序
Cursor cursor = database.query("person", new String[]{"personid", "name", "age"},
"personid=?", new String[]{String.valueOf(id)}, null, null, null);
if(cursor.moveToNext()){
return new Person(cursor.getInt(0), cursor.getString(1), cursor.getShort(2));
}
return null;
}
public void delete(Integer... ids){
if(ids.length>0){
StringBuilder sb = new StringBuilder();
String[] strIds = new String[ids.length];
for(int i=0 ; i < ids.length ; i++){
sb.append('?').append(',');
strIds[i] = String.valueOf(ids[i]);
}
sb.deleteCharAt(sb.length()-1);
SQLiteDatabase database = dbmanger.getWritableDatabase();
//参数 表名 指定条件 条件占位值
database.delete("person", "personid in("+ sb + ")", strIds);
}
}
public List<Person> getScrollData(int startResult, int maxResult){
List<Person> persons = new ArrayList<Person>();
SQLiteDatabase database = dbmanger.getWritableDatabase();
//参数 表名 返回字段 指定条件 指定条件映射值 是否分组 分组条件 是否排序 分页条件
Cursor cursor = database.query("person", new String[]{"personid", "name", "age"},
null, null, null, null, "personid desc", startResult+ ","+ maxResult);
while(cursor.moveToNext()){
persons.add(new Person(cursor.getInt(0), cursor.getString(1), cursor.getShort(2)));
}
return persons;
}
public long getCount(){
SQLiteDatabase database = dbmanger.getWritableDatabase();
Cursor cursor = database.query("person", new String[]{"count(*)"}, null, null, null, null, null);
if(cursor.moveToNext()){
return cursor.getLong(0);
}
return 0;
}
}
4 测试类一
package it.date;
import java.util.List;
import it.bean.Person;
import it.service.PersonService;
import android.test.AndroidTestCase;
import android.util.Log;
/**
*
* 执行PersonService的测试
*
*/
public class PersonServiceTest extends AndroidTestCase {
private static final String tag="PersonServiceTest";
public void testsave()throws Exception{
PersonService personservice=new PersonService(this.getContext());
for(int i=0;i<10;i++)
{
personservice.save(new Person("huhuanhuan",(short)33));
}
}
public void testfindbyid(){
PersonService personservice=new PersonService(this.getContext());
Person p=personservice.findbyid(1);
Log.i(tag,p.toString());
}
public void testupdate(){
Person person=new Person(1,"chun",(short)20);
PersonService personservice=new PersonService(this.getContext());
personservice.update(person);
Person p=personservice.findbyid(1);
Log.i(tag,p.toString());
}
public void testgetdatePerson(){
Person p=new Person();
PersonService personservice=new PersonService(this.getContext());
List<Person> list=personservice.getdatePerson(0, 10);
for(int i=0;i<list.size();i++){
p=(Person)list.get(i);
Log.i(tag,p.toString());
}
}
public void testgetcount(){
PersonService personservice=new PersonService(this.getContext());
long l=personservice.getcount();
Log.i(tag, String.valueOf(l));
}
public void testdelete()
{
PersonService personservice=new PersonService(this.getContext());
personservice.delete(1,2,3);
}
}
5 测试类二
package it.date;
import java.util.List;
import it.bean.Person;
import it.service.PersonSQLservice;
import android.test.AndroidTestCase;
import android.util.Log;
/**
*
* 执行PersonSQLservice 进行测试
*
*/
public class PersonSQLserviceTest extends AndroidTestCase {
private static final String TAG="PersonSQLserviceTest";
public void testsave(){
PersonSQLservice psql=new PersonSQLservice(this.getContext());
for(int i=0;i<10;i++)
{
psql.save(new Person("李渊", (short)1));
}
}
public void testFind() throws Exception{
PersonSQLservice psql=new PersonSQLservice(this.getContext());
Person person = psql.find(22);
Log.i(TAG, person.toString());
}
public void testUpdate() throws Exception{
PersonSQLservice psql=new PersonSQLservice(this.getContext());
Person person = psql.find(1);
person.setName("liming");
psql.update(person);
//Log.i(TAG, person.toString());
}
public void testGetCount() throws Exception{
PersonSQLservice psql=new PersonSQLservice(this.getContext());
Log.i(TAG, String.valueOf(psql.getCount()));
}
public void testGetScrollData() throws Exception{
PersonSQLservice psql=new PersonSQLservice(this.getContext());
List<Person> persons = psql.getScrollData(0, 20);
for(Person person : persons){
Log.i(TAG, person.toString());
}
}
public void testDelete() throws Exception{
PersonSQLservice psql=new PersonSQLservice(this.getContext());
psql.delete(1,2,3);
}
}
在做测试的时候 必须要对其应用进行配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.date" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> <activity android:name=".DataActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="7" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="it.date" android:label="Tests for My App" /> </manifest>
6 视图界面文件一
<?xml version="1.0" encoding="utf-8"?> <!-- 相对布局 --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="40px" android:layout_height="wrap_content" android:textSize="20px" android:id="@+id/personid" /> <TextView android:layout_width="150px" android:layout_height="wrap_content" android:layout_toRightOf="@id/personid" android:layout_alignTop="@id/personid" android:gravity="center_horizontal" android:textSize="20px" android:id="@+id/name" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/name" android:layout_toRightOf="@id/name" android:gravity="right" android:textSize="20px" android:id="@+id/age" /> </RelativeLayout>
7 视图界面主文件 2
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/listview" /> </LinearLayout>
8 业务bean
package it.bean;
/**
*
* 数据库的实体类
*
*/
public class Person {
private Integer personId;
private String name;
private Short age;
public Person() {
}
public Person(Integer personId, String name, Short age) {
this.personId = personId;
this.name = name;
this.age = age;
}
public Person(String name, Short age) {
this.name=name;
this.age=age;
}
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
return "Person [personId=" + personId + ", name=" + name + ", age="
+ age + "]";
}
}
9 主应用 Activity
package it.date;
import it.bean.Person;
import it.service.PersonService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class DataActivity extends Activity {
private static final String TAG="DataActivity";
private ListView listview;
private PersonService personservice;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取ListView
listview=(ListView)this.findViewById(R.id.listview);
//获取数据库德数据
personservice=new PersonService(this);
/**
*方法一 SimpleAdapter 适配器 绑定的参数数据是list对象 比较啰嗦
*/
List<Person> persons=personservice.getdatePerson(9, 20);
//绑定数据 设置适配器
List<HashMap<String,String>> list=new ArrayList<HashMap<String,String>>();
/**
* 适配器有 ArrayAdapter<T> T 可以是String Integer
* SimpleAdapter,SimpleCursorAdapter
*/
HashMap<String,String> hs=new HashMap<String,String>();
hs.put("personid", "编号");
hs.put("name", "名称");
hs.put("age", "年龄");
list.add(hs);
for(Person person:persons){
HashMap<String,String> map=new HashMap<String,String>();
map.put("personid", String.valueOf(person.getPersonId()));
map.put("name", person.getName());
map.put("age", String.valueOf(person.getAge()));
list.add(map);
}
/**
* 定义一个适配器 参数一 上下文信息 当前的上下文信息 是当前的类
* 参数二 加载的值
* 参数三 加载的视图界面文件
* 参数四 加载的目录 这个目录 是根据键值去取的值 在上面已经设置好了这个键值对
* 参数五 加载的数据对应的属性
*/
SimpleAdapter adapter=new SimpleAdapter(DataActivity.this, list, R.layout.person,new String[]{"personid",
"name","age"}, new int[]{R.id.personid,R.id.name,R.id.age});
//给这个ListView设置初始的适配器
listview.setAdapter(adapter);
// 为ListView添加事件
listview.setOnItemClickListener(new OnItemClickListener() {
/**
* 参数一 表示 点击的 listview
* 参数二 表示点击的最外层的那个元素
* 说明 int position, long id 是所在行的id
*/
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ListView listView = (ListView)parent;
//获取所在行的数据 position和id都表示选择的item数据
HashMap<String, String> itemData = (HashMap<String, String>)listView.getItemAtPosition(position);
String personid = itemData.get("personid");
String name = itemData.get("name");
String age = itemData.get("age");
//输出 01-17 14:54:47.919: INFO/DataActivity(9280):
//className=android.widget.RelativeLayout
Log.i(TAG, "className="+ view.getClass().getName());
Log.i(TAG, "personid="+ personid+ "name="+name + "age"+ age);
Log.i(TAG, "result="+ (position==id)); //trues
Log.i(TAG, "id="+id);
Log.i("TAG", "position="+position);
Toast.makeText(DataActivity.this, name.toString(),
1).show();
}
});
/**
* 方法二 获取 值
* 推荐使用方法二去设置适配器 获取数据的值 这样会更合理
* 绑定的数据是游标形式 但是主键id 必须以_id命名 如果不是 可以在查询数据的时候设置别名 并且绑定的参数必须是_id
* 否则会报异常信息
*/
// Cursor cursor = personservice.getdateRawPerson(0, 10);
/**
* 参数一 上下文信息
* 参数二 加载的视图界面文件
* 参数三 游标数据
* 参数四 数据目录
* 参数五 对应的数据值对应的id
* 表示把参数五对应的字段 参数四绑定起来
* 注意 列名 必须指定为_id 如果你的数据的主键id 不是以_id命名 必须在查询的时候 指定 别名为_id 否则会报异常信息
*/
// SimpleCursorAdapter ada = new SimpleCursorAdapter(this, R.layout.person, cursor,
// new String[]{"_id", "name", "age"}, new int[]{R.id.personid, R.id.name, R.id.age});
//绑定适配器
// listview.setAdapter(ada);
}
}
ok 到这里就全部结束了 大家只要看懂了源代码 就完全明白了sqlite这种嵌入式的sql了