对sqlite的使用做一下简单的汇总。

来源:互联网 发布:动态寄生虫 猫云seo 编辑:程序博客网 时间:2024/06/07 23:43

 

  1. /**  
  2.  * @FILE:DBOpenHelper.java  
  3.  * @AUTHOR:Administrator  
  4.  * @DATE:2013-5-14 下午10:06:29  
  5.  **/  
  6. package com.yehui.service;  
  7.   
  8. import android.content.Context;  
  9. import android.database.sqlite.SQLiteDatabase;  
  10. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  11. import android.database.sqlite.SQLiteOpenHelper;  
  12.   
  13. /*******************************************  
  14.  *   
  15.  * @CLASS:DBOpenHelper  
  16.  * @DESCRIPTION:sqlite数据库必须继承SQLiteOpenHelper(抽象类)  
  17.  * @AUTHOR:Administrator  
  18.  * @VERSION:v1.0  
  19.  * @DATE:2013-5-14 下午10:06:29  
  20.  *******************************************/  
  21. public class DBOpenHelper extends SQLiteOpenHelper {  
  22.   
  23.     /**  
  24.      * create a instance DBOpenHelper.  
  25.      *   
  26.      * @param context  
  27.      *            上下文对象  
  28.      * @param name  
  29.      *            数据库名称  
  30.      * @param factory  
  31.      *            CursorFactory  
  32.      * @param version  
  33.      *            版本号(第一次生成数据库时,版本号是1,只执行一次)  
  34.      */  
  35.     public DBOpenHelper(Context context) {  
  36.         super(context, "yehui.db", null, 1);  
  37.   
  38.     }  
  39.   
  40.     /*  
  41.      * (non-Javadoc)当创建数据库的时候就会创建下面的表,可以在这里创建多张表:表中的字段的类型可以完全没有,  
  42.      * varchar(20)长度并不能限制。可以输入超过20字符的长度。  
  43.      *   
  44.      * @see  
  45.      * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite  
  46.      * .SQLiteDatabase)  
  47.      */  
  48.     @Override  
  49.     public void onCreate(SQLiteDatabase db) {  
  50.         String sql = "create table person(personid integer primary key autoincrement, name varchar(20))";  
  51.         // 执行这句sql  
  52.         db.execSQL(sql);  
  53.     }  
  54.   
  55.     /*  
  56.      * (non-Javadoc)对数据库更新,可以在这个方法里面对数据表做alter.:也就是说当 super(context, "yehui.db",  
  57.      * null, 1);这里面的版本号发生改变的时候就会调用这个方法,执行完成后将数据库的版本号设置为新的版本号  
  58.      *   
  59.      * @see  
  60.      * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite  
  61.      * .SQLiteDatabase, int, int)  
  62.      */  
  63.     @Override  
  64.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  65.         String sql = "ALTER TABLE PERSON ADD PHONE VARCHAR(12) NULL";  
  66.         db.execSQL(sql);  
  67.     }  
  68.   
  69. }  
其次,为了方法建立一个bean来对应表中的内容:

[html] view plain copy print?
  1. /**  
  2.  * @FILE:Person.java  
  3.  * @AUTHOR:Administrator  
  4.  * @DATE:2013-5-14 下午10:31:18  
  5.  **/  
  6. package com.yehui.entity;  
  7.   
  8. /*******************************************  
  9.  *   
  10.  * @CLASS:Person  
  11.  * @DESCRIPTION:bean  
  12.  * @AUTHOR:Administrator  
  13.  * @VERSION:v1.0  
  14.  * @DATE:2013-5-14 下午10:31:18  
  15.  *******************************************/  
  16. public class Person {  
  17.     private Integer id;  
  18.     private String name;  
  19.     private String phone;  
  20.   
  21.     public Person(String name, String phone) {  
  22.         this.name = name;  
  23.         this.phone = phone;  
  24.     }  
  25.   
  26.     public Person(Integer id, String name, String phone) {  
  27.         super();  
  28.         this.id = id;  
  29.         this.name = name;  
  30.         this.phone = phone;  
  31.     }  
  32.   
  33.     public Person() {  
  34.         super();  
  35.     }  
  36.   
  37.     @Override  
  38.     public String toString() {  
  39.         return "Person [id=" + id + "name=" + name + "phone=" + phone + "]";  
  40.     }  
  41.   
  42.     public Integer getId() {  
  43.         return id;  
  44.     }  
  45.   
  46.     public void setId(Integer id) {  
  47.         this.id = id;  
  48.     }  
  49.   
  50.     public String getName() {  
  51.         return name;  
  52.     }  
  53.   
  54.     public void setName(String name) {  
  55.         this.name = name;  
  56.     }  
  57.   
  58.     public String getPhone() {  
  59.         return phone;  
  60.     }  
  61.   
  62.     public void setPhone(String phone) {  
  63.         this.phone = phone;  
  64.     }  
  65.   
  66.     public static void main(String[] args) {  
  67.         Person person = new Person("yehui", "132");  
  68.         System.out.println(person.toString());  
  69.     }  
  70. }  
再次:建立一个service类来处理业务逻辑(注意两种不同的操作方法使用sql的不同)

[html] view plain copy print?
  1. /**  
  2.  * @FILE:PersonService.java  
  3.  * @AUTHOR:Administrator  
  4.  * @DATE:2013-5-14 下午10:41:47  
  5.  **/  
  6. package com.yehui.service;  
  7.   
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10.   
  11. import android.content.ContentValues;  
  12. import android.content.Context;  
  13. import android.database.Cursor;  
  14. import android.database.sqlite.SQLiteDatabase;  
  15. import android.util.Log;  
  16.   
  17. import com.yehui.entity.Person;  
  18.   
  19. /*******************************************  
  20.  *   
  21.  * @CLASS:PersonService  
  22.  * @DESCRIPTION:对person进行增删改查操作  
  23.  * @AUTHOR:Administrator  
  24.  * @VERSION:v1.0  
  25.  * @DATE:2013-5-14 下午10:41:47  
  26.  *******************************************/  
  27. public class PersonService {  
  28.     private DBOpenHelper dbOpenHelper;  
  29.     public final static String TAG = "PersonService";  
  30.   
  31.     /**  
  32.      * create a instance PersonService. 会创建数据库  
  33.      *   
  34.      * @param context  
  35.      */  
  36.     public PersonService(Context context) {  
  37.         super();  
  38.         this.dbOpenHelper = new DBOpenHelper(context);  
  39.     }  
  40.   
  41.     /**  
  42.      * @description:保存  
  43.      * @author:Administrator  
  44.      * @return:void  
  45.      * @param person  
  46.      */  
  47.   
  48.     public void save(Person person) {  
  49.         // 如果数据表不存在先创建数据表,存在,则不创建  
  50.         SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  51.         // SQLiteDatabase db1 = dbOpenHelper.getWritableDatabase();这个和  
  52.         // SQLiteDatabase db是同一个对象  
  53.         // 方法1  
  54.         // 使用?。参数形式  
  55.         // db.execSQL("insert into person(name,phone) values(?,?)", new Object[]  
  56.         // {  
  57.         // person.getName(), person.getPhone() });  
  58.         // 或者使用sqlite自带的操作方法  
  59.         // 方法2  
  60.         ContentValues values = new ContentValues();  
  61.         values.put("name", person.getName());  
  62.         values.put("phone", person.getPhone());  
  63.         db.insert("person", null, values);  
  64.         // 注意这里的第二个参数(表的字段名)。db.insert("person", "personid",  
  65.         // null);也就说新增一条纪录,id是null:这个语句不会报错,只会按自增的id新增一条纪录  
  66.     }  
  67.   
  68.     /**  
  69.      * @description:按照id删除数据  
  70.      * @author:Administrator  
  71.      * @return:void  
  72.      * @param id  
  73.      */  
  74.   
  75.     public void delete(Integer id) {  
  76.         // 如果数据表不存在先创建数据表,存在,则不创建  
  77.         SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  78.         // 方法1  
  79.         // 使用?。参数形式  
  80.         // db.execSQL("delete from person where personid=?", new Object[] { id  
  81.         // });  
  82.         // 方法2  
  83.         db.delete("person", "personid=?", new String[] { id.toString() });  
  84.     }  
  85.   
  86.     public void update(Person person) {  
  87.         // 如果数据表不存在先创建数据表,存在,则不创建  
  88.         SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  89.         // 方法1  
  90.         // 使用?。参数形式  
  91.         // db.execSQL("update  person set name=?,phone=? where personid=? ", new  
  92.         // Object[] { person.getName(),person.getPhone(),person.getPersonid()  
  93.         // });  
  94.         // 方法2  
  95.         ContentValues values = new ContentValues();  
  96.         values.put("name", person.getName());  
  97.         values.put("phone", person.getPhone());  
  98.         db.update("person", values, "personid=?", new String[] { person.getId()  
  99.                 .toString() });  
  100.     }  
  101.   
  102.     /**  
  103.      * @description:依照id查找数据  
  104.      * @author:Administrator  
  105.      * @return:Person  
  106.      * @param id  
  107.      * @return  
  108.      */  
  109.   
  110.     public Person find(Integer id) {  
  111.         Person person = null;  
  112.         // 如果数据表不存在先调用getReadableDatabase方法,存在,则不创建  
  113.         SQLiteDatabase db = dbOpenHelper.getReadableDatabase();  
  114.         // 方法1  
  115.         // 使用?。参数形式  
  116.         // Cursor cursor = db.rawQuery("select * from person where personid=?",  
  117.         // new String[] { id.toString() });  
  118.         // 方法2  
  119.         Cursor cursor = db.query("person", null, "personid=?",  
  120.                 new String[] { id.toString() }, null, null, null);  
  121.         // 如果找到一个result,则返回result  
  122.         if (cursor.moveToFirst()) {  
  123.             person = new Person();  
  124.             person.setId(cursor.getColumnIndex("personid"));  
  125.             person.setName(cursor.getString(cursor.getColumnIndex("name")));  
  126.             person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));  
  127.         }  
  128.         Log.v(TAG, person.toString());  
  129.         cursor.close();  
  130.         return person;  
  131.     }  
  132.   
  133.     /**  
  134.      * @description:分页查询  
  135.      * @author:Administrator  
  136.      * @return:List<Person> 结果  
  137.      * @param offset  
  138.      *            跳过几条数据  
  139.      * @param maxResult  
  140.      *            总共查找几条数据  
  141.      * @return  
  142.      */  
  143.   
  144.     public List<Person> getScrollData(Integer offset, int maxResult) {  
  145.         List<Person> persons = new ArrayList<Person>();  
  146.         // 如果数据表不存在先调用getReadableDatabase方法,存在,则不创建  
  147.         SQLiteDatabase db = dbOpenHelper.getReadableDatabase();  
  148.         // 方法1  
  149.         // 使用?。参数形式  
  150.         // Cursor cursor = db.rawQuery(  
  151.         // "select * from person order by personid asc limit ?,?",  
  152.         // new String[] { String.valueOf(offset),  
  153.         // String.valueOf(maxResult) });  
  154.         // 方法2  
  155.         Cursor cursor = db.query("person", null, null, null, null, null,  
  156.                 "personid asc", offset + "," + maxResult);  
  157.         // 循环将结果加入到list中  
  158.         while (cursor.moveToNext()) {  
  159.             Person person = new Person();  
  160.             person.setId(cursor.getColumnIndex("personid"));  
  161.             person.setName(cursor.getString(cursor.getColumnIndex("name")));  
  162.             person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));  
  163.             persons.add(person);  
  164.         }  
  165.         cursor.close();  
  166.         // Log.v(TAG, person.toString());  
  167.         return persons;  
  168.     }  
  169.   
  170.     /**  
  171.      * @description:获得纪录的总数  
  172.      * @author:Administrator  
  173.      * @return:long  
  174.      * @return  
  175.      */  
  176.   
  177.     public long getCount() {  
  178.         SQLiteDatabase db = dbOpenHelper.getReadableDatabase();  
  179.         // 方法1  
  180.         // Cursor cursor = db.rawQuery("select count(*) from person", null);  
  181.         // 方法2  
  182.         Cursor cursor = db.query("person", new String[] { "count('*')" }, null,  
  183.                 null, null, null, null, null);  
  184.         cursor.moveToFirst();  
  185.         // 取得第一个字段的所有记录数  
  186.         long count = cursor.getLong(0);  
  187.         cursor.close();  
  188.         Log.v(TAG, "纪录总数" + count);  
  189.         return count;  
  190.     }  
  191. }  

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

[html] view plain copy print?
  1. /**  
  2.  * @FILE:DBTest.java  
  3.  * @AUTHOR:Administrator  
  4.  * @DATE:2013-5-14 下午11:52:06  
  5.  **/  
  6. package com.yehui.db;  
  7.   
  8. import java.util.List;  
  9.   
  10. import android.app.Activity;  
  11. import android.database.sqlite.SQLiteDatabase;  
  12. import android.os.Bundle;  
  13. import android.test.AndroidTestCase;  
  14. import android.view.Menu;  
  15.   
  16. import com.yehui.entity.Person;  
  17. import com.yehui.service.DBOpenHelper;  
  18. import com.yehui.service.PersonService;  
  19.   
  20. /*******************************************  
  21.  *   
  22.  * @CLASS:DBTest  
  23.  * @DESCRIPTION:sqlite单元测试必须继承AndroidTestCase  
  24.  * @AUTHOR:Administrator  
  25.  * @VERSION:v1.0  
  26.  * @DATE:2013-5-14 下午11:52:06  
  27.  *******************************************/  
  28. public class DBTest extends AndroidTestCase  {  
  29.     private DBOpenHelper dbOpenHelper;  
  30.     private SQLiteDatabase sqliteDatabase;  
  31.     public void createDB() {  
  32.         dbOpenHelper = new DBOpenHelper(this.getContext());  
  33.         // 创建数据表  
  34.         sqliteDatabase = dbOpenHelper.getWritableDatabase();  
  35.     }  
  36.   
  37.     public void save() {  
  38.         PersonService personService = new PersonService(  
  39.                 this.getContext());  
  40.         Person person = new Person("zhangxueyou", "123456");  
  41.         personService.save(person);  
  42.     }  
  43.   
  44.     public void delete() {  
  45.         PersonService personService = new PersonService(  
  46.                 this.getContext());  
  47.         personService.delete(2);  
  48.     }  
  49.   
  50.     public void update() {  
  51.         PersonService personService = new PersonService(  
  52.                 this.getContext());  
  53.         Person person = personService.find(1);  
  54.         person.setName("guofucheng");  
  55.         personService.update(person);  
  56.     }  
  57.   
  58.     public Person find() {  
  59.         PersonService personService = new PersonService(  
  60.                 this.getContext());  
  61.         Person person = personService.find(1);  
  62.         return person;  
  63.     }  
  64.   
  65.     public List<Person> getScrollData() {  
  66.         PersonService personService = new PersonService(  
  67.                 this.getContext());  
  68.         List<Person> persons = personService.getScrollData(0, 2);  
  69.         return persons;  
  70.     }  
  71.   
  72.     public long getCount() {  
  73.         PersonService personService = new PersonService(  
  74.                 this.getContext());  
  75.         long count = personService.getCount();  
  76.         return count;  
  77.     }  
  78. }  

好了,总结就这么多了。

补充一点,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);

0 0
原创粉丝点击