我爱你JAVA 发表于 2013-1-30 01:11:17

SQLite数据读取

    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()这个方法调用的   */@Overridepublic 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()这个方法调用的   */@Overridepublic 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 = newContentValues();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 = newContentValues();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;for(int i=0 ; i < ids.length ; i++){sb.append('?').append(',');strIds = String.valueOf(ids);}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"?><!-- 相对布局 --><RelativeLayoutxmlns: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;}@Overridepublic String toString() {return "Person ";}} 
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了
页: [1]
查看完整版本: SQLite数据读取