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()这个方法调用的
     */
	@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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值