需要5个类:

Person实体类

而外能够接纳文件或SharedPreferences存款和储蓄数据,还足以挑选使用SQLite数据仓库储存款和储蓄数据。

1.实体类:Person.java

复制代码 代码如下:

在Android平台上,集成了二个嵌入式关系型数据库—SQLite,

2.抽象类:SQLOperate.java(封装了对数据库的操作)

package com.ljq.domain;

一、SQLite三支持NULL、INTEGESportage、REAL(浮点数字)、TEXT(字符串文本)和BLOB(贰进制对象)数据类型,即使它援助的花色纵然唯有三种,但实际上sqlite三也经受varchar(n)、char(n)、decimal(p,s)
等数据类型,只不过在运算或保存时会转成对应的二种数据类型。

3.助手类:DBOpenHelper.java(继承SQLiteOpenHelper)

public class Person {
    private Integer id;
    private String name;
    private String phone;

二、SQLite最大的特色是你能够保存任何项指标多少到别的字段中,无论那列证明的数据类型是怎么着。比方:能够在Integer字段中存放字符串,大概在布尔型字段中存放浮点数,也许在字符型字段中存放日期型值。

肆.实现类:SQLOperateImpl.java(完成抽象类SQLOperate.java)

    public Person() {
        super();
    }

三、但有1种境况例外:定义为INTEGEMurano P宝马X5IMAPAJEROY KEY的字段只好存储61几个人整数,
当向这种字段中保存除整数以外的数码时,将会生出错误。

5.测试类:Test.java(继承AndroidTestCase)

    public Person(String name, String phone) {
        super();
        this.name = name;
        this.phone = phone;
    }

4、其它, SQLite 在深入分析CREATE TABLE 语句时,会忽视 CREATE TABLE
语句中跟在字段名后面包车型大巴数据类型新闻,如上边语句会忽略
name字段的类型音信:

1.Person.java

    public Person(Integer id, String name, String phone) {
        super();
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

CREATE TABLE person (personid integer primary key autoincrement, name
varchar(20))

复制代码 代码如下:

    public Integer getId() {
        return id;
    }

 

package com.mrzhu.sqltite;

    public void setId(Integer id) {
        this.id = id;
    }

SQLite能够剖判大多数行业内部SQL语句,如:

public class Person {

    public String getName() {
        return name;
    }

查询语句:select * from 表名 where 条件子句 group by 分组字句 having
… order by 排序子句

 private int _id;
 private String name;

    public void setName(String name) {
        this.name = name;
    }

如:select * from person

 public int getId() {
  return _id;
 }

    public String getPhone() {
        return phone;
    }

        select * from person order by id desc

 public void setId(int _id) {
  this._id = _id;
 }

    public void setPhone(String phone) {
        this.phone = phone;
    }

        select name from person group by name having count(*)>1

 public String getName() {
  return name;
 }

}

分页SQL与mysql类似,上面SQL语句获取伍条记下,跳过后边三条记下

 public void setName(String name) {
  this.name = name;
 }

DBOpenHelper数据库关联类

select * from Account limit 5 offset 3 或者 select * from Account
limit 3,5

 @Override
 public String toString() {
  return “Person [id=” + _id + “, name=” + name + “]”;
 }

复制代码 代码如下:

安顿语句:insert into 表名(字段列表) values(值列表)。如: insert into
person(name, age) values(‘传智’,3)

 public Person() {
  super();
 }

package com.ljq.db;

履新语句:update 表名 set 字段名=值 where 条件子句。如:update person
set name=‘传智‘ where id=拾

 public Person(int _id, String name) {
  super();
  this._id = _id;
  this.name = name;
 }
}

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

去除语句:delete from 表名 where 条件子句。如:delete from person  where
id=十

2.SQLOperate.java

public class DBOpenHelper extends SQLiteOpenHelper {
    // 类未有实例化,是不能够用作父类构造器的参数,必须注脚为静态
    private static final String DBNAME = “ljq.db”;
    private static final int VERSION = 1;

 

复制代码 代码如下:

    //
第多个参数CursorFactory内定在执行查询时获得三个游标实例的厂子类,
    // 设置为null,代表行使系统私下认可的厂子类
    public DBOpenHelper(Context context) {
        super(context, DBNAME, null, VERSION);
    }

使用SQLiteDatabase操作SQLite数据库

package com.mrzhu.sqltite;

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(“CREATE TABLE PERSON (ID INTEGER PRIMARY KEY
AUTOINCREMENT, NAME VARCHAR(20), PHONE VARCHAR(20))”);
    }

Android提供了八个名称为SQLiteDatabase的类,该类封装了一些操作数据库的API。

import java.util.List;

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
        // 注:生产条件上不可能做去除操作
        db.execSQL(“DROP TABLE IF EXISTS PERSON”);
        onCreate(db);
    }
}

能够调用SQLiteDatabase的静态方法:

/**
 * 增加和删除改查
 * @author ZLQ
 *
 */
public interface SQLOperate {
 public void add(Person p);
 public void delete(int id);
 public void updata(Person p);
 public List<Person> find();
 public Person findById(int id);
}

PersonService业务类

public static SQLiteDatabase openDatabase(String
path,SQLiteDatabase.CursorFactory factory,int flags)

3.DBOpenHelper.java

复制代码 代码如下:

 flags参数可以是 OPEN_READWRITE, OPEN_READONLY
,CREATE_IF_NECESSARY,
NO_LOCALIZED_COLLATO昂CoraS多少个的一个或八个(七个形式组合用|隔开).

复制代码 代码如下:

package com.ljq.db;

public static SQLiteDatabase openOrCreateDatabase(File
file,SQLiteDatabase.CursorFactory factory)

package com.mrzhu.sqltite;

import java.util.ArrayList;
import java.util.List;

public static SQLiteDatabase openOrCreateDatabase(String
path,SQLiteDatabase.CursorFactory factory)

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import android.content.Context;
import android.database.Cursor;

来开拓文件系统中位居相对路线path的数据库。

/**
 * 助手类
 * @author ZLQ
 *
 */
public class DBOpneHelper extends SQLiteOpenHelper {

import com.ljq.domain.Person;

还是能通过Context对象调用

 private static final int VERSION = 1;//版本
 private static final String DB_NAME = “people.db”;//数据库名
 public static final String STUDENT_TABLE = “student”;//表名
 public static final String _ID = “_id”;//表中的列名
 public static final String NAME = “name”;//表中的列名
 //创制数据库语句,STUDENT_TABLE,_ID ,NAME的前后都要加空格
 private static final String CREATE_TABLE = “create table ” +
STUDENT_TABLE + ” ( ” + _ID + ” Integer primary key autoincrement,” +
NAME + ” text)”;

public class PersonService {
    private DBOpenHelper dbOpenHelper = null;

public abstract SQLiteDatabase openOrCreateDatabase(String name,int
mode,SQLiteDatabase.CursorFactory
factory)直接在私有数据库目录创造或打开一个名称为name的数据库,

 public DBOpneHelper(Context context) {
  super(context, DB_NAME, null, VERSION);
 }

    /**
     * 构造函数
     *
     *
调用getWritableDatabase()或getReadableDatabase()方法后,会缓存SQLiteDatabase实例;
     *
因为这里是手提式有线电话机应用程序,一般唯有3个用户访问数据库,所以提议不休憩数据库,保持两次三番意况。
     *
getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,
     * 所以假使不是立异数据库的话,最好调用后者来博取数据库连接。
     *
     *
对于熟谙SQL语句的程序猿最佳使用exeSQL(),rawQuery(),因为比较直观明了
     *
     * @param context
     */
    public PersonService(Context context){
        dbOpenHelper = new DBOpenHelper(context);
    }

注意:mode只的是MODE_PRIVATE , MODE_WORLD_READABLE,
MODE_WORLD_WRITEABLE。

 //数据库第一回被创设时调用
 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL(CREATE_TABLE);
 }

    public void save(Person person){
        dbOpenHelper.getWritableDatabase().execSQL(“insert into
person(name, phone) values (?, ?)”,
                new Object[]{person.getName(), person.getPhone()});
    }

Context还有:

 //版本晋级时被调用
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {

    public void update(Person person){
        dbOpenHelper.getWritableDatabase().execSQL(“update person set
name=?, phone=? where id=?”,
                new Object[]{person.getName(), person.getPhone(),
person.getId()});
    }

public abstract String[]
databaseList();//重返私有数据库目录全数数据库名字

 }

    public void delete(Integer… ids){
        if(ids.length>0){
            StringBuffer sb = new StringBuffer();
            for(Integer id : ids){
                sb.append(“?”).append(“,”);
            }
            sb.deleteCharAt(sb.length() – 1);
            dbOpenHelper.getWritableDatabase().execSQL(“delete from
person where id in (“+sb+”)”, (Object[])ids);
        }
    }

public abstract boolean deleteDatabase(String
name);//删除私有数据库目录内文件名字为name的数据库。

}

    public Person find(Integer id){
        Cursor cursor =
dbOpenHelper.getReadableDatabase().rawQuery(“select id, name, phone from
person where id=?”,
                new String[]{String.valueOf(id)});
        if(cursor.moveToNext()){
            int personid = cursor.getInt(0);
            String name = cursor.getString(1);
            String phone = cursor.getString(2);
            return new Person(personid, name, phone);
        }
        return null;
    }

除却在文件系统中成立SQLite数据库,android还帮助SQLite内部存款和储蓄器数据库。在好几要求暂且创办数据库,并且对操作速率相对供给高的状态下,SQLite内部存款和储蓄器数据库就发挥作用了,用SQLiteDatabase的静态方法:

4.SQLOperateImpl.java

    public long getCount(){
        Cursor cursor =
dbOpenHelper.getReadableDatabase().query(“person”,
                new String[]{“count(*)”},
null,null,null,null,null);
        if(cursor.moveToNext()){
            return cursor.getLong(0);
        }
        return 0;
    }

public static SQLiteDatabase create(SQLiteDatabase.CursorFactory
factory)

复制代码 代码如下:

    /**
     * 分页
     *
     * @param startResult 偏移量,默认从0开始
     * @param maxResult 每页突显的条数
     * @return
     */
    public List<Person> getScrollData(int startResult, int
maxResult){
        List<Person> persons = new ArrayList<Person>();
        //Cursor cursor =
dbOpenHelper.getReadableDatabase().query(“person”, new String[]{“id,
name, phone”},
        //        “name like ?”, new String[]{“%ljq%”}, null, null,
“id desc”, “1,2”);
        Cursor cursor =
dbOpenHelper.getReadableDatabase().rawQuery(“select * from person limit
?,?”,
                new String[]{String.valueOf(startResult),
String.valueOf(maxResult)});
        while(cursor.moveToNext()) {
            int personid = cursor.getInt(0);
            String name = cursor.getString(1);
            String phone = cursor.getString(2);
            persons.add(new Person(personid, name, phone));
        }
        return persons;
    }

来创建,成立失利重临null。

package com.mrzhu.sqltite;

   

最后记住,不管用何种格局展开了数据库,获得的SQLite对象不再行使时,都要调用close()来关闭展开的数据库,不然抛出IllegalStateException相当。

import java.util.ArrayList;
import java.util.List;

}

使用SQLiteDatabase对象足以成功对数据开始展览增添(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这么些操作简称为CRUD)。对SQLiteDatabase的学习,大家应该器重掌握execSQL()和rawQuery()方法。
execSQL()方法能够施行insert、delete、update和CREATE
TABLE之类有改造行为的SQL语句; rawQuery()方法能够推行select语句。

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

PersonServiceTest测试类

execSQL()方法的采取例子:

public class SQLOperateImpl implements SQLOperate{

复制代码 代码如下:

SQLiteDatabase db = ….;

 private DBOpneHelper dbOpenHelper;

package com.ljq.test;

db.execSQL(“insert into person(name, age) values(‘传智播客’, 肆)”);

 public SQLOperateImpl(Context context) {
  dbOpenHelper = new DBOpneHelper(context);
 }

import java.util.List;

db.close();

 /**
  * 增,用insert向数据库中插入数据
  */
 public void add(Person p) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put(DBOpneHelper._ID, p.getId());
  values.put(DBOpneHelper.NAME, p.getName());
  db.insert(DBOpneHelper.STUDENT_TABLE, null, values);
 }

import com.ljq.db.PersonService;
import com.ljq.domain.Person;

推行下边SQL语句会往person表中加多进一条记下,在实际上利用中,
语句中的“传智播客”那么些参数值应该由用户输入分界面提供,若是把用户输入的剧情原样组拼到上边的insert语句,
当用户输入的源委涵盖单引号时,组拼出来的SQL语句就能够存在语法错误。要化解那么些标题亟需对单引号进行转义,也等于把单引号转变来四个单引号。有些时候用户往往还有只怕会输入像“
&
”这么些独特SQL符号,为力保组拼好的SQL语句语法精确,必须对SQL语句中的这几个出色SQL符号都开始展览转义,显著,对每条SQL语句都做那样的拍卖工作是相比繁琐的。
SQLiteDatabase类提供了二个重载后的execSQL(String sql, Object[]
bindArgs)方法,使用这么些艺术能够缓和日前提到的主题素材,因为这几个方式匡助采纳占位符参数(?)。使用例子如下:

 /**
  * 删,通过id删除数据
  */
 public void delete(int id) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  db.delete(DBOpneHelper.STUDENT_TABLE, DBOpneHelper._ID + “=?”, new
String[]{String.valueOf(id)});
 }

import android.test.AndroidTestCase;
import android.util.Log;

SQLiteDatabase db = ….;

 /**
  * 改,修改钦定id的数码
  */
 public void updata(Person p) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put(DBOpneHelper._ID, p.getId());
  values.put(DBOpneHelper.NAME, p.getName());
  db.update(DBOpneHelper.STUDENT_TABLE, values, DBOpneHelper._ID +
“=?”, new String[]{String.valueOf(p.getId())});
 }

public class PersonServiceTest extends AndroidTestCase{
    private final String TAG = “PersonServiceTest”;

db.execSQL(“insert into person(name, age) values(?,?)”, new
Object[]{“传智播客”, 四}); 

 /**
  * 查,查询表中兼有的数据
  */
 public List<Person> find() {
  List<Person> persons = null;
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  Cursor cursor = db.query(DBOpneHelper.STUDENT_TABLE, null, null,
null, null, null, null);
  if(cursor != null){
   persons = new ArrayList<Person>();
   while(cursor.moveToNext()){
    Person person = new Person();
    int _id =
cursor.getInt(cursor.getColumnIndex(DBOpneHelper._ID));
    String name =
cursor.getString(cursor.getColumnIndex(DBOpneHelper.NAME));
    person.setId(_id);
    person.setName(name);
    persons.add(person);
   }
  }
  return persons;
 }

    public void testSave() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        personService.save(new Person(“zhangsan1”, “059188893343”));
        personService.save(new Person(“zhangsan2”, “059188893343”));
        personService.save(new Person(“zhangsan3”, “059188893343”));
        personService.save(new Person(“zhangsan4”, “059188893343”));
        personService.save(new Person(“zhangsan5”, “059188893343”));
    }

db.close();

 /**
  * 查询钦赐id的数目
  */
 public Person findById(int id) {
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  Cursor cursor = db.query(DBOpneHelper.STUDENT_TABLE, null,
DBOpneHelper._ID + “=?”, new String[]{String.valueOf(id)}, null,
null, null);
  Person person = null;
  if(cursor != null && cursor.moveToFirst()){
   person = new Person();
   int _id = cursor.getInt(cursor.getColumnIndex(DBOpneHelper._ID));
   String name =
cursor.getString(cursor.getColumnIndex(DBOpneHelper.NAME));
   person.setId(_id);
   person.setName(name);
  }
  return person;
 }
}

    public void testUpdate() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        Person person = personService.find(1);
        person.setName(“linjiqin”);
        personService.update(person);
    }

execSQL(String sql, Object[]
bindArgs)方法的首先个参数为SQL语句,第2个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的地方对应。

5.Test.java

    public void testFind() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        Person person = personService.find(1);
        Log.i(TAG, person.getName());
    }

SQLiteDatabase的rawQuery() 用于推行select语句,使用例子如下:
SQLiteDatabase db = ….;

 

    public void testList() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        List<Person> persons = personService.getScrollData(0,
10);
        for(Person person : persons){
            Log.i(TAG, person.getId() + ” : ” + person.getName());
        }
    }

Cursor cursor = db.rawQuery(“select * from person”, null);

在AndroidManifest.xml中的<application></application>外添加

    public void testCount() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        Log.i(TAG, String.valueOf(personService.getCount()));
    }

while (cursor.moveToNext()) {

(targetPackage是现阶段工程的包名)

    public void testDelete() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        personService.delete(1);
    }

int personid = cursor.getInt(0); //获取第二列的值,第一列的目录从0开头

 

    public void testDeleteMore() throws Exception{
        PersonService personService = new
PersonService(this.getContext());
        personService.delete(new Integer[]{2, 5, 6});
    }
}

String name = cursor.getString(壹);//获取第壹列的值

 <instrumentation

运行结果

int age = cursor.getInt(2);//获取第3列的值

android:targetPackage=”com.mrzhu.sqltite”

必发娱乐官方网站 1

}

android:name=”android.test.InstrumentationTestRunner”>

你大概感兴趣的稿子:

  • Android
    SQLite数据库版本晋级的管理落实
  • Android实现创造或进步数据库时进行语句
  • Android
    SQLite数据库增加和删除改查操作的施用详解
  • Android使用SQLite数据库的轻巧实例
  • 标准数据库Android:sqllite的简易利用
  • Android中操作SQLite数据库火速入门教程
  • Android制造和行使数据库SQLIte
  • Android
    数据库打包随APK公布的实例代码
  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的不二等秘书籍详解
  • Android开拓中数据库晋级且表增加新列的法子

cursor.close();

</instrumentation>

db.close(); 

 

rawQuery()方法的第一个参数为select语句;第叁个参数为select语句中占位符参数的值,假使select语句未有运用占位符,该参数能够设置为null。带占位符参数的select语句使用例子如下:

在<application></application>中添加<uses-library
android:name=”android.test.runner”/>

Cursor cursor = db.rawQuery(“select * from person where name like ? and
age=?”, new String[]{“%传智%”, “4”});

复制代码 代码如下:

 

package com.mrzhu.sqltite;

Cursor是结果集游标,用于对结果集进行随机走访,假如我们熟知jdbc,
其实Cursor与JDBC中的ResultSet效率很相像。使用moveToNext()方法能够将游标从当前行移动到下壹行,假如已经移过了结果集的末梢壹行,再次来到结果为false,不然为true。此外Cursor
还会有常用的moveToPrevious()方法(用于将游标从此时此刻行移动到上一行,假设已经移过了结果集的率先行,重返值为false,不然为true
)、moveToFirst()方法(用于将游标移动到结果集的首先行,如若结果集为空,再次回到值为false,不然为true
)和moveToLast()方法(用于将游标移动到结果集的末梢1行,假若结果集为空,重回值为false,不然为true
) 。

import java.util.List;

除外前方给我们介绍的execSQL()和rawQuery()方法,
SQLiteDatabase还特意提供了对应于添加、删除、更新、查询的操作方法:
insert()、delete()、update()和query()
。这个主意其实是给那2个不太明白SQL语法的人使用的,对于熟稔SQL语法的程序员来讲,直接使用execSQL()和rawQuery()方法试行SQL语句就能够成功多少的丰富、删除、更新、查询操作。

import android.test.AndroidTestCase;
import android.util.Log;

Insert()方法用于增多数据,各样字段的数目选取ContentValues进行存放。
ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(String key,
Xxx value)和getAsXxx(String key)方法,
 key为字段名称,value为字段值,Xxx指的是各类常用的数据类型,如:String、Integer等。

public class Test extends AndroidTestCase {
 public void testAdd() throws Exception{
  SQLOperateImpl test = new SQLOperateImpl(getContext());
  Person person = new Person(2, “Peter”);
  test.add(person);
 }

SQLiteDatabase db = databaseHelper.getWritableDatabase();

 public void testDelete() throws Exception{
  SQLOperateImpl test = new SQLOperateImpl(getContext());
  test.delete(1);
 }

ContentValues values = new ContentValues();

 public void testUpdata() throws Exception{
  SQLOperateImpl test = new SQLOperateImpl(getContext());
  Person person = new Person(1, “Tom”);
  test.updata(person);
 }

values.put(“name”, “传智播客”);

 public void testFind() throws Exception{
  SQLOperateImpl test = new SQLOperateImpl(getContext());
  List<Person> persons = test.find();
  for (Person person : persons) {
   Log.i(“System.out”, person.toString());
  }
 }

values.put(“age”, 4);

 public void testFindById() throws Exception{
  SQLOperateImpl test = new SQLOperateImpl(getContext());
  Person person = test.findById(2);
  Log.i(“System.out”, person.toString());
 }
}

long rowid = db.insert(“person”, null,
values);//再次来到新扩大记录的行号,与主键id非亲非故

你或然感兴趣的小说:

  • Android
    SQLite数据库增删改查操作的接纳详解
  • Android开采之SQLite的运用办法
  • Android使用SQLite数据库的总结实例
  • android创设数据库(SQLite)保存图片示例
  • 长远Android SQLite
    事务管理详解
  • android中sqlite的按规范查找的小例子
  • Android中SQLite
    使用方法详解

甭管第多个参数是不是包蕴数据,试行Insert()方法料定会增添一条记下,假设第7个参数为空,会增加一条除主键之外任何字段值为Null的笔录。Insert()方法内部实际上通过结构insert语句完结数据的丰裕,Insert()方法的第四个参数用于内定空值字段的名称,相信我们对此参数会以为狐疑,此参数的效应是干嘛的?是那样的:假使第六个参数values
为Null也许成分个数为0,
Insert()方法确定要加多一条除了主键之外其他字段为Null值的记录,为了满意这条insert语句的语法,
insert语句必须给定三个字段名,如:insert into person(name)
values(NULL),如果不给定字段名 , insert语句就成了这么: insert into
person()
values(),分明那不知足标准SQL的语法。对于字段名,提出选择主键之外的字段,倘诺运用了INTEGEPAJERO类型的主键字段,试行类似insert
into person(personid)
values(NULL)的insert语句后,该主键字段值也不会为NULL。倘若第多少个参数values
不为Null并且成分的个数大于0 ,能够把第二个参数设置为null。

delete()方法的行使:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

db.delete(“person”, “personid<?”, new String[]{“2”});

db.close();

上边代码用于从person表中剔除personid小于二的笔录。

 

update()方法的选取:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(“name”, “传智播客”);//key为字段名,value为值

db.update(“person”, values, “personid=?”, new String[]{“1”}); 

db.close();

地点代码用于把person表中personid等于1的记录的name字段的值改为“传智播客”。

query()方法其实是把select语句拆分成了若干个组成都部队分,然后作为艺术的输入参数:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

Cursor cursor = db.query(“person”, new String[]{“personid,name,age”},
“name like ?”, new String[]{“%溧阳%”}, null, null, “personid desc”,
“1,2”);

while (cursor.moveToNext()) {

         int personid = cursor.getInt(0);
//获取第贰列的值,第三列的目录从0开端

        String name = cursor.getString(1);//获取第3列的值

        int age = cursor.getInt(二);//获取第1列的值

}

cursor.close();

db.close(); 

地方代码用于从person表中搜寻name字段含有“传智”的记录,相配的笔录按personid降序排序,对排序后的结果略过第叁条记下,只获得贰条记下。

query(table, columns, selection, selectionArgs, groupBy, having,
orderBy, limit)方法各参数的意义:

table:表名。约等于select语句from关键字背后的一些。假设是多表联合查询,能够用逗号将八个表名分开。

columns:要查询出来的列名。也就是select语句select关键字背后的壹对。

selection:查询条件子句,相当于select语句where关键字前边的有的,在条件子句允许行使占位符“?”

selectionArgs:对应于selection语句中占位符的值,值在数组中的地点与占位符在讲话中的地点必须1律,不然就能够有极其。

groupBy:也便是select语句group by关键字背后的片段

having:相当于select语句having关键字背后的一些

orderBy:也就是select语句order by关键字背后的有的,如:personid desc,
age asc;

limit:钦赐偏移量和获取的记录数,相当于select语句limit关键字背后的一对。

使用SQLiteOpenHelper对数据库进行版本管理

假使运用使用到了SQLite数据库,在用户初次使用软件时,须求成立应用使用到的数目库表结构及拉长一些开首化记录,其它在软件晋级的时候,也亟需对数据表结构进行创新。在Android系统,为大家提供了二个名字为SQLiteOpenHelper的类,该类用于对数据库版本进行保管,该类是3个抽象类,必须一而再它手艺选拔。
为了落到实处对数据库版本实行管理,SQLiteOpenHelper类有三种关键的不二等秘书技,分别是onCreate(SQLiteDatabase
db)和onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion)。仍是能够完结public abstract void onUpgrade(SQLiteDatabase
db,int oldVersion,int
newVersion)方法,它在历次成功张开数据库后率先被实行,默许景况下此措施的贯彻为空。

 

当调用SQLiteOpenHelper的getWritableDatabase()也许getReadableDatabase()方法获得用于操作数据库的SQLiteDatabase实例的时候,假设数据库不设有,Android系统会自动生成贰个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里能够转换数据库表结构及丰硕一些施用使用到的初叶化数据。onUpgrade()方法在数据库的本子发生变化时会被调用,数据库的版本是由技师调节的,假使数据库未来的本子是一,由于事务的内需,修改了数据库表的结构,这时候就供给提高软件,进级软件时梦想更新用户手提式有线电话机里的多少库表结构,为了兑现这一指标,能够把原先的数据库版本设置为2(有同学问设置为三行不行?当然能够,尽管您愿意,设置为100也行),并且在onUpgrade()方法里面完结表结构的换代。当软件的本子晋级次数比较多,这时在onUpgrade()方法里面能够依据原版号和目的版本号进行推断,然后作出相应的表结构及数码更新。

 

getWritableDatabase()和getReadableDatabase()方法都足以拿走三个用以操作数据库的SQLiteDatabase实例。但getWritableDatabase()
方法以读写格局张开数据库,1旦数据库的磁盘空间满了,数据库就只好读而不能够写,倘诺使用的是getWritableDatabase()
方法就能够出错。getReadableDatabase()方法先以读写格局伸开数据库,要是数据库的磁盘空间满了,就能够打开失败,当展开失利后会继续尝试以只读方式打开数据库。但若随后再一次调用此情势时,难点一度被消除,只读的SQLiteDatabase对象会被关闭,而再一次归来二个可读写的SQLiteDatabase数据库对象。

public class DatabaseHelper extends SQLiteOpenHelper {

    //类未有实例化,是不可能用作父类构造器的参数,必须注脚为静态

         private static final String name = “itcast”; //数据库名称

         private static final int version = 1; //数据库版本

         public DatabaseHelper(Context context) {

//第多个参数CursorFactory钦赐在举行查询时获得1个游标实例的厂子类,设置为null,代表选取系统暗中认可的工厂类

                super(context, name, null, version);

         }

        @Override public void onCreate(SQLiteDatabase db) {

              db.execSQL(“CREATE TABLE IF NOT EXISTS person (personid
integer primary key autoincrement, name varchar(20), age INTEGER)”);   

         }

        @Override public void onUpgrade(SQLiteDatabase db, int
oldVersion, int newVersion) {

               db.execSQL(“DROP TABLE IF EXISTS person”);

               onCreate(db);

         }

}

地方onUpgrade()方法在数据库版本每一遍发生变化时都会把用户手机上的数码库表删除,然后再重新成立。一般在实质上项目中是无法这么做的,准确的做法是在立异数据库表结构时,还要思量用户存放于数据库中的数据不会丢掉。

选取SQLiteOpenHelper获取用于操作数据库的SQLiteDatabase实例

public class DatabaseHelper extends SQLiteOpenHelper {

         private static final String name = “itcast”; //数据库名称

         private static final int version = 1; //数据库版本

         ……略

}

public class HelloActivity extends Activity {

    @Override public void onCreate(Bundle savedInstanceState) {

        ……

        Button button =(Button) this.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

public void onClick(View v) {

DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

SQLiteDatabase db = databaseHelper.getWritableDatabase();

db.execSQL(“insert into person(name, age) values(?,?)”, new
Object[]{“传智播客”, 四});

db.close();  

}});        

    }

}

首先次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例平日境况下会保持数据库的开采状态,所以在您不再必要SQLiteDatabase实例时,请立即调用close()方法释放财富。1旦SQLiteDatabase实例被缓存,数次调用getWritableDatabase()或getReadableDatabase()方法获得的都以均等实例。

动用职业操作SQLite数据库

运用SQLiteDatabase的beginTransaction()方法能够展开2个业务,程序实施到endTransaction()
方法时会检查工作的标识是不是为成功,借使为成功则交由业务,不然回滚事务。当使用必要提交业务,必须在程序施行到endTransaction()方法在此以前运用setTransactionSuccessful()
方法设置工作的注明为成功,假使不调用setTransactionSuccessful()
方法,暗中认可会回滚事务。使用例子如下: SQLiteDatabase db = ….;

db.beginTransaction();//伊始事务

try {

    db.execSQL(“insert into person(name, age) values(?,?)”, new
Object[]{“传智播客”, 4});

    db.execSQL(“update person set name=? where personid=?”, new
Object[]{“传智”, 1});

    db.setTransactionSuccessful();//调用此方法会在进行到endTransaction()
时提交当前作业,即使不调用此方法会回滚事务

} finally {

    db.endTransaction();//由业务的证明决定是付诸业务,照旧回滚事务

db.close(); 

上面两条SQL语句在同三个业务中进行。

SQLite示例程序

   1.创建Android工程

       Project name: db

       BuildTarget:Android2.2

       Application name: 数据库应用

       Package name: com.jbridge.db

       Create Activity: DBActivity

       Min SDK Version:8、

 2. Person实体

 

Java代码  

  1. package com.jbridge.domain;  
  2.   
  3. import android.R.string;  
  4.   
  5. public class Person {  
  6.     private Integer id;  
  7.     private String name;  
  8.     private Short age;  
  9.   
  10.     public Person(String name, Short age) {  
  11.         this.name = name;  
  12.         this.age = age;  
  13.     }  
  14.   
  15.     public Person(Integer id, String name, Short age) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.         this.age = age;  
  20.     }  
  21.   
  22.     public Integer getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(Integer id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public Short getAge() {  
  39.         return age;  
  40.     }  
  41.   
  42.     public void setAge(Short age) {  
  43.         this.age = age;  
  44.     }  
  45.   
  46.     @Override  
  47.     public String toString() {  
  48.         return “Person [id=” + id + “, name=” + name + “, age=” + age + “]”;  
  49.     }  
  50.   
  51. }  

    package com.jbridge.domain;

    import android.R.string;

    public class Person {

    private Integer id;
    private String name;
    private Short age;
    
    public Person(String name, Short age) {
        this.name = name;
        this.age = age;
    }
    
    public Person(Integer id, String name, Short age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    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 Short getAge() {
        return age;
    }
    
    public void setAge(Short age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    

    }

 

  3.编写DataBaseOpenHelper类

    
 DataBaseOpenHelper承继自SQLiteOpenHelper类。我们须要成立数据表,必须重写onCreate(更新时重写onUpgrade方法)方法,在那个措施中开创数据表。

 

Java代码  

  1. package com.jbridge.service;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class DataBaseOpenHelper extends SQLiteOpenHelper {  
  9.     // 类未有实例化,是不可能用作父类构造器的参数,必须证明为静态  
  10.     private static String dbname = “zyj”;  
  11.     private static int version = 1;  
  12.   
  13.     public DataBaseOpenHelper(Context context) {  
  14.         // 首个参数是利用的上下文  
  15.         // 第壹个参数是运用的数据库名字  
  16.         // 第多个参数CursorFactory钦赐在执行查询时取得贰个游标实例的工厂类,设置为null,代表选拔系统暗许的厂子类  
  17.         // 第陆个参数是数据库版本,必须是大于0的int(即非负数)  
  18.         super(context, dbname, null, version);  
  19.         // TODO Auto-generated constructor stub  
  20.     }  
  21.   
  22.     public DataBaseOpenHelper(Context context, String name,  
  23.             CursorFactory factory, int version) {  
  24.         super(context, name, factory, version);  
  25.         // TODO Auto-generated constructor stub  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onCreate(SQLiteDatabase db) {  
  30.         db.execSQL(“CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)”);  
  31.     }  
  32.   
  33.     // onUpgrade()方法在数据库版本每一遍发生变化时都会把用户手提式无线电话机上的多少库表删除,然后再重新创立。  
  34.     // 一般在骨子里项目中是无法如此做的,正确的做法是在更新数据库表结构时,还要思考用户存放于数据库中的数据不会丢掉,从版本几更新到版本几。  
  35.     @Override  
  36.     public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {  
  37.         db.execSQL(“DROP TABLE IF EXISTS person”);  
  38.         onCreate(db);  
  39.     }  
  40.   
  41. }  

    package com.jbridge.service;

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;

    public class DataBaseOpenHelper extends SQLiteOpenHelper {

    // 类没有实例化,是不能用作父类构造器的参数,必须声明为静态
    private static String dbname = "zyj";
    private static int version = 1;
    
    public DataBaseOpenHelper(Context context) {
        // 第一个参数是应用的上下文
        // 第二个参数是应用的数据库名字
        // 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
        // 第四个参数是数据库版本,必须是大于0的int(即非负数)
        super(context, dbname, null, version);
        // TODO Auto-generated constructor stub
    }
    
    public DataBaseOpenHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
    }
    
    // onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。
    // 一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失,从版本几更新到版本几。
    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        db.execSQL("DROP TABLE IF EXISTS person");
        onCreate(db);
    }
    

    }

 4.编写PersonService类

      Person瑟维斯类首要达成对业务逻辑和数据库的操作。

 

Java代码  

  1. package com.jbridge.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Currency;  
  5. import java.util.List;  
  6.   
  7. import android.content.Context;  
  8. import android.database.Cursor;  
  9. import android.database.sqlite.SQLiteDatabase;  
  10.   
  11. import com.jbridge.domain.Person;  
  12.   
  13. public class PersonService {  
  14.   
  15.     private DataBaseOpenHelper dbOpenHelper;  
  16.   
  17.     // private Context context;  
  18.   
  19.     public PersonService(Context context) {  
  20.         // this.context = context;  
  21.         dbOpenHelper = new DataBaseOpenHelper(context);  
  22.     }  
  23.   
  24.     public void save(Person person) {  
  25.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  26.         database.beginTransaction();  
  27.         database.execSQL(“insert into person(name,age)values(?,?)”,  
  28.                 new Object[] { person.getName(), person.getAge() });  
  29.         // database.close();能够不关门数据库,他里面会缓存1个数据库对象,假使今后还要用就直接用这几个缓存的数据库对象。但经过  
  30.         // context.openOrCreateDatabase(arg0, arg一, arg贰)张开的数据库必须得倒闭  
  31.         database.setTransactionSuccessful();  
  32.         database.endTransaction();  
  33.   
  34.     }  
  35.   
  36.     public void update(Person person) {  
  37.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  38.         database.execSQL(  
  39.                 “update person set name=?,age=? where personid=?”,  
  40.                 new Object[] { person.getName(), person.getAge(),  
  41.                         person.getId() });  
  42.     }  
  43.   
  44.     public Person find(Integer id) {  
  45.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  46.         Cursor cursor = database.rawQuery(  
  47.                 “select * from person where personid=?”,  
  48.                 new String[] { String.valueOf(id) });  
  49.         if (cursor.moveToNext()) {  
  50.             return new Person(cursor.getInt(0), cursor.getString(1),  
  51.                     cursor.getShort(2));  
  52.         }  
  53.         return null;  
  54.     }  
  55.   
  56.     public void delete(Integer… ids) {  
  57.         if (ids.length > 0) {  
  58.             StringBuffer sb = new StringBuffer();  
  59.             for (Integer id : ids) {  
  60.                 sb.append(‘?’).append(‘,’);  
  61.             }  
  62.             sb.deleteCharAt(sb.length() – 1);  
  63.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  64.             database.execSQL(  
  65.                     “delete from person where personid in(” + sb.toString()  
  66.                             + “)”, ids);  
  67.         }  
  68.     }  
  69.   
  70.     public List<Person> getScrollData(int startResult, int maxResult) {  
  71.         List<Person> persons = new ArrayList<Person>();  
  72.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  73.         Cursor cursor = database.rawQuery(  
  74.                 “select * from person limit ?,?”,  
  75.                 new String[] { String.valueOf(startResult),  
  76.                         String.valueOf(maxResult) });  
  77.         while (cursor.moveToNext()) {  
  78.             persons.add(new Person(cursor.getInt(0), cursor.getString(1),  
  79.                     cursor.getShort(2)));  
  80.         }  
  81.         return persons;  
  82.     }  
  83.   
  84.     // 获取分页数据,提要求SimpleCursorAdapter使用。  
  85.     public Cursor getRawScrollData(int startResult, int maxResult) {  
  86.         List<Person> persons = new ArrayList<Person>();  
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  88.         return database.rawQuery(  
  89.                 “select personid as _id ,name,age from person limit ?,?”,  
  90.                 new String[] { String.valueOf(startResult),  
  91.                         String.valueOf(maxResult) });  
  92.   
  93.     }  
  94.   
  95.     public long getCount() {  
  96.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  97.         Cursor cursor = database.rawQuery(“select count(*) from person”, null);  
  98.         if (cursor.moveToNext()) {  
  99.             return cursor.getLong(0);  
  100.         }  
  101.         return 0;  
  102.     }  
  103.   
  104. }  

    package com.jbridge.service;

    import java.util.ArrayList;
    import java.util.Currency;
    import java.util.List;

    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;

    import com.jbridge.domain.Person;

    public class PersonService {

    private DataBaseOpenHelper dbOpenHelper;

    // private Context context;

    public PersonService(Context context) {

       // this.context = context;
       dbOpenHelper = new DataBaseOpenHelper(context);
    

    }

    public void save(Person person) {

       SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
       database.beginTransaction();
       database.execSQL("insert into person(name,age)values(?,?)",
               new Object[] { person.getName(), person.getAge() });
       // database.close();可以不关闭数据库,他里面会缓存一个数据库对象,如果以后还要用就直接用这个缓存的数据库对象。但通过
       // context.openOrCreateDatabase(arg0, arg1, arg2)打开的数据库必须得关闭
       database.setTransactionSuccessful();
       database.endTransaction();
    

    }

    public void update(Person person) {

       SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
       database.execSQL(
               "update person set name=?,age=? where personid=?",
               new Object[] { person.getName(), person.getAge(),
                       person.getId() });
    

    }

    public Person find(Integer id) {

       SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
       Cursor cursor = database.rawQuery(
               "select * from person where personid=?",
               new String[] { String.valueOf(id) });
       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) {
           StringBuffer sb = new StringBuffer();
           for (Integer id : ids) {
               sb.append('?').append(',');
           }
           sb.deleteCharAt(sb.length() - 1);
           SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
           database.execSQL(
                   "delete from person where personid in(" + sb.toString()
                           + ")", ids);
       }
    

    }

    public List getScrollData(int startResult, int maxResult) {

       List<Person> persons = new ArrayList<Person>();
       SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
       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;
    

    }

    // 获取分页数据,提要求SimpleCursorAdapter使用。
    public Cursor getRawScrollData(int startResult, int maxResult) {

       List<Person> persons = new ArrayList<Person>();
       SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
       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 = dbOpenHelper.getReadableDatabase();
       Cursor cursor = database.rawQuery("select count(*) from person", null);
       if (cursor.moveToNext()) {
           return cursor.getLong(0);
       }
       return 0;
    

    }

    }

 上面是利用 insert()、delete()、update()和query()方法完毕的业务类

 

Java代码  

  1. package com.jbridge.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Currency;  
  5. import java.util.List;  
  6.   
  7. import android.R.string;  
  8. import android.content.ContentValues;  
  9. import android.content.Context;  
  10. import android.database.Cursor;  
  11. import android.database.sqlite.SQLiteDatabase;  
  12.   
  13. import com.jbridge.domain.Person;  
  14.   
  15. public class OtherPersonService {  
  16.   
  17.     private DataBaseOpenHelper dbOpenHelper;  
  18.   
  19.     // private Context context;  
  20.   
  21.     public OtherPersonService(Context context) {  
  22.         // this.context = context;  
  23.         dbOpenHelper = new DataBaseOpenHelper(context);  
  24.     }  
  25.   
  26.     public void save(Person person) {  
  27.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  28.         ContentValues contentValues = new ContentValues();  
  29.         contentValues.put(“name”, person.getName());  
  30.         contentValues.put(“age”, person.getAge());  
  31.         database.insert(“person”, null, contentValues);  
  32.     }  
  33.   
  34.     public void update(Person person) {  
  35.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  36.         ContentValues contentValues = new ContentValues();  
  37.         contentValues.put(“name”, person.getName());  
  38.         contentValues.put(“age”, person.getAge());  
  39.         database.update(“person”, null, “personid=?”,  
  40.                 new String[] { String.valueOf(person.getId()) });  
  41.     }  
  42.   
  43.     public Person find(Integer id) {  
  44.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  45.         Cursor cursor = database.query(“person”, new String[] { “personid”,  
  46.                 “name”, “age” }, “personid=?”,  
  47.                 new String[] { String.valueOf(id) }, null, null, null);  
  48.         if (cursor.moveToNext()) {  
  49.             return new Person(cursor.getInt(0), cursor.getString(1),  
  50.                     cursor.getShort(2));  
  51.         }  
  52.         return null;  
  53.     }  
  54.   
  55.     public void delete(Integer… ids) {  
  56.         if (ids.length > 0) {  
  57.             StringBuffer sb = new StringBuffer();  
  58.             String[] strIds = new String[ids.length];  
  59.             // for (Integer id : ids) {  
  60.             // sb.append(‘?’).append(‘,’);  
  61.             // }  
  62.             for (int i = 0; i < strIds.length; i++) {  
  63.                 sb.append(‘?’).append(‘,’);  
  64.                 strIds[i] = String.valueOf(ids[i]);  
  65.             }  
  66.             sb.deleteCharAt(sb.length() – 1);  
  67.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  68.             database.delete(“person”, “personid in(” + sb.toString() + “)”,  
  69.                     strIds);  
  70.         }  
  71.     }  
  72.   
  73.     public List<Person> getScrollData(int startResult, int maxResult) {  
  74.         List<Person> persons = new ArrayList<Person>();  
  75.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  76.         Cursor cursor = database.query(“person”, new String[] { “personid”,  
  77.                 “name”, “age” }, null, null, null, null, “personid desc”,  
  78.                 startResult + “,” + maxResult);  
  79.         while (cursor.moveToNext()) {  
  80.             persons.add(new Person(cursor.getInt(0), cursor.getString(1),  
  81.                     cursor.getShort(2)));  
  82.         }  
  83.         return persons;  
  84.     }  
  85.   
  86.     public long getCount() {  
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  88.         Cursor cursor = database.query(“person”, new String[] { “count(*)” },  
  89.                 null, null, null, null, null);  
  90.         if (cursor.moveToNext()) {  
  91.             return cursor.getLong(0);  
  92.         }  
  93.         return 0;  
  94.     }  
  95.   
  96. }  

    package com.jbridge.service;

    import java.util.ArrayList;
    import java.util.Currency;
    import java.util.List;

    import android.R.string;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;

    import com.jbridge.domain.Person;

    public class OtherPersonService {

    private DataBaseOpenHelper dbOpenHelper;
    
    // private Context context;
    
    public OtherPersonService(Context context) {
        // this.context = context;
        dbOpenHelper = new DataBaseOpenHelper(context);
    }
    
    public void save(Person person) {
        SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", person.getName());
        contentValues.put("age", person.getAge());
        database.insert("person", null, contentValues);
    }
    
    public void update(Person person) {
        SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", person.getName());
        contentValues.put("age", person.getAge());
        database.update("person", null, "personid=?",
                new String[] { String.valueOf(person.getId()) });
    }
    
    public Person find(Integer id) {
        SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
        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) {
            StringBuffer sb = new StringBuffer();
            String[] strIds = new String[ids.length];
            // for (Integer id : ids) {
            // sb.append('?').append(',');
            // }
            for (int i = 0; i < strIds.length; i++) {
                sb.append('?').append(',');
                strIds[i] = String.valueOf(ids[i]);
            }
            sb.deleteCharAt(sb.length() - 1);
            SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
            database.delete("person", "personid in(" + sb.toString() + ")",
                    strIds);
        }
    }
    
    public List<Person> getScrollData(int startResult, int maxResult) {
        List<Person> persons = new ArrayList<Person>();
        SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
        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 = dbOpenHelper.getReadableDatabase();
        Cursor cursor = database.query("person", new String[] { "count(*)" },
                null, null, null, null, null);
        if (cursor.moveToNext()) {
            return cursor.getLong(0);
        }
        return 0;
    }
    

    }

   伍.编辑测试类

       编写3个针对性Person瑟维斯的测试类,测试Person瑟维斯类中的各样艺术是或不是科学。

 

Java代码  

  1. package com.jbridge.db;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.jbridge.domain.Person;  
  6. import com.jbridge.service.OtherPersonService;  
  7. import com.jbridge.service.PersonService;  
  8.   
  9. import android.test.AndroidTestCase;  
  10. import android.util.Log;  
  11.   
  12. public class PersonServiceTest extends AndroidTestCase {  
  13.     private static String TAG = “PersonServiceTest”;  
  14.   
  15.     // OtherPersonService personService = new  
  16.     // OtherPersonService(this.getContext());  
  17.     // //不能那样写,因为Android把context意况变量是在PersonServiceTest实例化后给他的  
  18.   
  19.     public void testSave() throws Exception {  
  20.         PersonService personService = new PersonService(this.getContext());  
  21.         // personService.save(new Person(“老猪”, (short) 11));  
  22.         for (int i = 0; i < 10; i++) {  
  23.             personService.save(new Person(“你” + i, (short) (i + 10)));  
  24.         }  
  25.   
  26.     }  
  27.   
  28.     public void testFind() throws Exception {  
  29.         PersonService personService = new PersonService(this.getContext());  
  30.         Person person = personService.find(1);  
  31.         Log.i(TAG, person.toString());  
  32.     }  
  33.   
  34.     public void testUpdate() throws Exception {  
  35.         PersonService personService = new PersonService(this.getContext());  
  36.         Person person = personService.find(1);  
  37.         person.setName(“lv”);  
  38.         personService.update(person);  
  39.     }  
  40.   
  41.     public void testDelete() throws Exception {  
  42.         PersonService personService = new PersonService(this.getContext());  
  43.         personService.delete(1, 2, 3);  
  44.     }  
  45.   
  46.     public void testGetCount() throws Exception {  
  47.         PersonService personService = new PersonService(this.getContext());  
  48.         Log.i(TAG, String.valueOf(personService.getCount()));  
  49.     }  
  50.   
  51.     public void testGetScrollData() throws Exception {  
  52.         PersonService personService = new PersonService(this.getContext());  
  53.         List<Person> persons = personService.getScrollData(0, 3);  
  54.         for (Person person : persons) {  
  55.             Log.i(TAG, person.toString());  
  56.         }  
  57.     }  
  58. }  

    package com.jbridge.db;

    import java.util.List;

    import com.jbridge.domain.Person;
    import com.jbridge.service.OtherPersonService;
    import com.jbridge.service.PersonService;

    import android.test.AndroidTestCase;
    import android.util.Log;

    public class PersonServiceTest extends AndroidTestCase {

    private static String TAG = "PersonServiceTest";
    
    // OtherPersonService personService = new
    // OtherPersonService(this.getContext());
    // //不可以这么写,因为Android把context环境变量是在PersonServiceTest实例化后给他的
    
    public void testSave() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        // personService.save(new Person("老猪", (short) 11));
        for (int i = 0; i < 10; i++) {
            personService.save(new Person("你" + i, (short) (i + 10)));
        }
    
    }
    
    public void testFind() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        Person person = personService.find(1);
        Log.i(TAG, person.toString());
    }
    
    public void testUpdate() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        Person person = personService.find(1);
        person.setName("lv");
        personService.update(person);
    }
    
    public void testDelete() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        personService.delete(1, 2, 3);
    }
    
    public void testGetCount() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        Log.i(TAG, String.valueOf(personService.getCount()));
    }
    
    public void testGetScrollData() throws Exception {
        PersonService personService = new PersonService(this.getContext());
        List<Person> persons = personService.getScrollData(0, 3);
        for (Person person : persons) {
            Log.i(TAG, person.toString());
        }
    }
    

    }

     启用测试效率,不要遗忘在AndroidManifest.xml文件中投入测试蒙受。为application成分增添多少个子成分:<uses-library
android:name=”android.test.runner”/>,为application成分增添2个弟兄成分:<instrumentation
android:name=”android.test.InstrumentationTestRunner”     android:targetPackage=”com.jbridge.db”
android:label=”Tests for My App” />。

 

       SQLite数据库以单个文件存款和储蓄,就如微软的Access数据库。有2个查看SQLite数据库文件的工具——SQLite
Developer,大家得以选拔它来查看数据库。Android将成立的数据仓库储存放在”/data/data/
com.jbridge.db/databases/person”,大家将它导出然后使用SQLite
Developer展开。

 

  陆.分页展现数据

       大家在ContactsService类中,提供了叁个赢得分页数据的秘诀。大家将调用它赢得的多寡,使用ListView组件彰显出来。

       编辑mail.xml:

 

Xml代码  

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <LinearLayout xmlns:android=””  
  3.     android:orientation=”vertical”  
  4.     android:layout_width=”fill_parent”  
  5.     android:layout_height=”fill_parent”  
  6.     >  
  7.     <RelativeLayout  
  8.   xmlns:android=””  
  9.   android:layout_width=”fill_parent”  
  10.   android:layout_height=”wrap_content”>  
  11.   <TextView  
  12.   android:layout_width=”40px”  
  13.   android:layout_height=”wrap_content”  
  14.   android:textSize=”20px”  
  15.   android:id=”@+id/personidtitle”  
  16.   android:text=”编号”  
  17.   />  
  18.    <TextView  
  19.   android:layout_width=”200px”  
  20.   android:layout_height=”wrap_content”  
  21.    android:textSize=”20px”  
  22.   android:layout_toRightOf=”@id/personidtitle”  
  23.    android:layout_alignTop=”@id/personidtitle”  
  24.    android:gravity=”center_horizontal”  
  25.    android:id=”@+id/nametitle”  
  26.    android:text=”姓名”  
  27.   />  
  28.    <TextView  
  29.   android:layout_width=”wrap_content”  
  30.   android:layout_height=”wrap_content”  
  31.    android:textSize=”20px”  
  32.   android:layout_toRightOf=”@id/nametitle”  
  33.    android:layout_alignTop=”@id/nametitle”  
  34.    android:id=”@+id/agetitle”  
  35.    android:text=”年龄”  
  36.   />  
  37. </RelativeLayout>  
  38. <ListView    
  39.     android:layout_width=”fill_parent”   
  40.     android:layout_height=”wrap_content”   
  41.     android:id=”@+id/listView”  
  42.     />  
  43. </LinearLayout>  


    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <RelativeLayout
    

    xmlns:android=””
    android:layout_width=”fill_parent”
    android:layout_height=”wrap_content”>




    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/listView"
    />
    

 

在mail.xml所在目录里增添2个personitem.xml:

 

Xml代码  

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <RelativeLayout  
  3.   xmlns:android=””  
  4.   android:layout_width=”fill_parent”  
  5.   android:layout_height=”wrap_content”>  
  6.   <TextView  
  7.   android:layout_width=”40px”  
  8.   android:layout_height=”wrap_content”  
  9.   android:textSize=”20px”  
  10.   android:id=”@+id/personid”  
  11.   />  
  12.    <TextView  
  13.   android:layout_width=”200px”  
  14.   android:layout_height=”wrap_content”  
  15.    android:textSize=”20px”  
  16.   android:layout_toRightOf=”@id/personid”  
  17.    android:layout_alignTop=”@id/personid”  
  18.    android:gravity=”center_horizontal”  
  19.    android:id=”@+id/name”  
  20.   />  
  21.    <TextView  
  22.   android:layout_width=”wrap_content”  
  23.   android:layout_height=”wrap_content”  
  24.    android:textSize=”20px”  
  25.   android:layout_toRightOf=”@id/name”  
  26.    android:layout_alignTop=”@id/name”  
  27.    android:id=”@+id/age”  
  28.   />  
  29. </RelativeLayout>  






 

 编辑 DBActivity 类:

 

Java代码  

  1. package com.jbridge.db;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import com.jbridge.domain.Person;  
  8. import com.jbridge.service.PersonService;  
  9.   
  10. import android.R.string;  
  11. import android.app.Activity;  
  12. import android.database.Cursor;  
  13. import android.os.Bundle;  
  14. import android.provider.LiveFolders;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.AdapterView;  
  18. import android.widget.ArrayAdapter;  
  19. import android.widget.ListView;  
  20. import android.widget.SimpleAdapter;  
  21. import android.widget.SimpleCursorAdapter;  
  22. import android.widget.Toast;  
  23.   
  24. public class DBActivity extends Activity {  
  25.     /** Called when the activity is first created. */  
  26.     private static final String TAG = “DBActivity”;  
  27. /*达成方式一 
  28.      @Override 
  29.      public void onCreate(Bundle savedInstanceState) { 
  30.      super.onCreate(savedInstanceState); 
  31.      setContentView(R.layout.main); 
  32.      PersonService personService=new PersonService(this); 
  33.      ListView listView = (ListView) this.findViewById(R.id.listView); 
  34.      
  35.      List<HashMap<String, String>> data = new ArrayList<HashMap<String, 
  36.      String>>(); 
  37.      // HashMap<String, String> title = new HashMap<String, String>(); 
  38.      // title.put(“personid”, “编号”); 
  39.      // title.put(“name”, “姓名”); 
  40.      // title.put(“age”, “年龄”); 
  41.      // data.add(title); 
  42.      
  43.      List<Person> persons= personService.getScrollData(0, 10); 
  44.      for (Person person : persons) { 
  45.      HashMap<String, String> p = new HashMap<String, String>(); 
  46.      p.put(“personid”, String.valueOf(person.getId())); 
  47.      p.put(“name”, person.getName()); 
  48.      p.put(“age”,String.valueOf(person.getAge())); 
  49.      data.add(p); 
  50.      } 
  51.      
  52.      // 适配器有: 
  53.      // ArrayAdapter<T> 
  54.      // simpAdapter 
  55.      // SimpleCursorAdapter 
  56.      SimpleAdapter adapter = new SimpleAdapter(DBActivity.this, data, 
  57.      R.layout.personitem, 
  58.      new String[] { “personid”, “name”, “age” }, 
  59.      new int[] {R.id.personid, R.id.name, R.id.age }); 
  60.      listView.setAdapter(adapter); 
  61.      
  62.      listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
  63.      @Override 
  64.      // parent即为你点击的listView 
  65.      // view为listview的外界布局 
  66.      public void onItemClick(AdapterView<?> parent, View view, int position, 
  67.      long id) { 
  68.      ListView listView= (ListView) parent; 
  69.      HashMap<String, String> itemdata= (HashMap<String, String>) 
  70.      listView.getItemAtPosition(position); 
  71.      String personid=itemdata.get(“personid”); 
  72.      String name=itemdata.get(“name”); 
  73.      String age=itemdata.get(“age”); 
  74.      Log.i(TAG,view.getClass().getName()); 
  75.      Log.i(TAG, “personid: “+personid+ ”   name: “+name+”   age:   “+age); 
  76.      Log.i(TAG,” position==id:”+ (position==id)); 
  77.     Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show(); 
  78.      } 
  79.      
  80.      }); 
  81.      
  82.      } 
  83.      
  84. */  
  85.       
  86. //  达成情势二(游标)  
  87.     @Override  
  88.     public void onCreate(Bundle savedInstanceState) {  
  89.         super.onCreate(savedInstanceState);  
  90.         setContentView(R.layout.main);  
  91.         PersonService personService = new PersonService(this);  
  92.         ListView listView = (ListView) this.findViewById(R.id.listView);  
  93.   
  94.         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();  
  95.         // HashMap<String, String> title = new HashMap<String, String>();  
  96.         // title.put(“personid”, “编号”);  
  97.         // title.put(“name”, “姓名”);  
  98.         // title.put(“age”, “年龄”);  
  99.         // data.add(title);  
  100.   
  101.         // 适配器有:  
  102.         // ArrayAdapter<T>  
  103.         // simpAdapter  
  104.         // SimpleCursorAdapter  
  105.         Cursor cursor = personService.getRawScrollData(0, 10);  
  106.         SimpleCursorAdapter adapter = new SimpleCursorAdapter(DBActivity.this,  
  107.                 R.layout.personitem, cursor, new String[] { “_id”, “name”,  
  108.                         “age” },  
  109.                 new int[] { R.id.personid, R.id.name, R.id.age });  
  110.         listView.setAdapter(adapter);  
  111.   
  112.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  113.   
  114.             @Override  
  115.             // parent即为你点击的listView  
  116.             // view为listview的外面布局  
  117.             public void onItemClick(AdapterView<?> parent, View view,  
  118.                     int position, long id) {  
  119.                 ListView listView = (ListView) parent;  
  120.                 Cursor cursor = (Cursor) listView.getItemAtPosition(position);  
  121.                 String personid = String.valueOf(cursor.getInt(0));  
  122.                 String name = String.valueOf(cursor.getString(1));  
  123.                 String age = String.valueOf(cursor.getShort(2));  
  124.                 Log.i(TAG, view.getClass().getName());  
  125.                 Log.i(TAG, “personid: ” + personid + ”   name: ” + name  
  126.                         + ”   age:   ” + age);  
  127.                 Log.i(TAG, ” position==id:” + (position == id));  
  128.                 Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show();  
  129.             }  
  130.   
  131.         });  
  132.   
  133.     }  
  134. }  

    package com.jbridge.db;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;

    import com.jbridge.domain.Person;
    import com.jbridge.service.PersonService;

    import android.R.string;
    import android.app.Activity;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.LiveFolders;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.SimpleCursorAdapter;
    import android.widget.Toast;

    public class DBActivity extends Activity {
    /* Called when the activity is first created. /
    private static final String TAG = “DBActivity”;
    /*达成情势一

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    PersonService personService=new PersonService(this);
    ListView listView = (ListView) this.findViewById(R.id.listView);
    
    List<HashMap<String, String>> data = new ArrayList<HashMap<String,
    String>>();
    // HashMap<String, String> title = new HashMap<String, String>();
    // title.put("personid", "编号");
    // title.put("name", "姓名");
    // title.put("age", "年龄");
    // data.add(title);
    
    List<Person> persons= personService.getScrollData(0, 10);
    for (Person person : persons) {
    HashMap<String, String> p = new HashMap<String, String>();
    p.put("personid", String.valueOf(person.getId()));
    p.put("name", person.getName());
    p.put("age",String.valueOf(person.getAge()));
    data.add(p);
    }
    
    // 适配器有:
    // ArrayAdapter<T>
    // simpAdapter
    // SimpleCursorAdapter
    SimpleAdapter adapter = new SimpleAdapter(DBActivity.this, data,
    R.layout.personitem,
    new String[] { "personid", "name", "age" },
    new int[] {R.id.personid, R.id.name, R.id.age });
    listView.setAdapter(adapter);
    
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    // parent即为你点击的listView
    // view为listview的外面布局
    public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    ListView listView= (ListView) parent;
    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");
    Log.i(TAG,view.getClass().getName());
    Log.i(TAG, "personid: "+personid+ "   name: "+name+"   age:   "+age);
    Log.i(TAG," position==id:"+ (position==id));
    

    Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show();

    }
    
    });
    
    }
    

    */

    // 达成格局二(游标)
    @Override
    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       PersonService personService = new PersonService(this);
       ListView listView = (ListView) this.findViewById(R.id.listView);
    
       List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
       // HashMap<String, String> title = new HashMap<String, String>();
       // title.put("personid", "编号");
       // title.put("name", "姓名");
       // title.put("age", "年龄");
       // data.add(title);
    
       // 适配器有:
       // ArrayAdapter<T>
       // simpAdapter
       // SimpleCursorAdapter
       Cursor cursor = personService.getRawScrollData(0, 10);
       SimpleCursorAdapter adapter = new SimpleCursorAdapter(DBActivity.this,
               R.layout.personitem, cursor, new String[] { "_id", "name",
                       "age" },
               new int[] { R.id.personid, R.id.name, R.id.age });
       listView.setAdapter(adapter);
    
       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
           @Override
           // parent即为你点击的listView
           // view为listview的外面布局
           public void onItemClick(AdapterView<?> parent, View view,
                   int position, long id) {
               ListView listView = (ListView) parent;
               Cursor cursor = (Cursor) listView.getItemAtPosition(position);
               String personid = String.valueOf(cursor.getInt(0));
               String name = String.valueOf(cursor.getString(1));
               String age = String.valueOf(cursor.getShort(2));
               Log.i(TAG, view.getClass().getName());
               Log.i(TAG, "personid: " + personid + "   name: " + name
                       + "   age:   " + age);
               Log.i(TAG, " position==id:" + (position == id));
               Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show();
           }
    
       });
    

    }
    }

  

  • db.rar
    (64.2 KB)

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注