您的位置:首页 > 移动开发 > Android开发

Android学习笔记---Android利用Sqlite,并且用sql语言操作SQLite数据库

2013-03-10 01:29 537 查看
6.对数据库进行操作:

一下是对数据库的操作代码,包括添加,删除,更新,查询,和分页,统计

-------------------------------------------------------------------

/DBSQLIte/src/com/credream/entity/Person.java

package com.credream.entity;

public class Person

{

private Integer id;

private String name;

private String phone;

public Person()

{

}

public Person(Integer id, String name, String phone)

{

this.id = id;

this.name = name;

this.phone = phone;

}

public Person(String name, String phone)

{

this.name = name;

this.phone = phone;

}

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 String getPhone()

{

return phone;

}

public void setPhone(String phone)

{

this.phone = phone;

}

@Override

public String toString()

{

return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";

}

}

----------------------------------------------------------

/DBSQLIte/src/com/credream/service/DBOpenHelter.java

package com.credream.service;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DBOpenHelter extends SQLiteOpenHelper

{

//父类没有默认构造器,需要显示调用

public DBOpenHelter(Context context)

{

super(context, "credream.db", null, 2);

//数据库创建完成后,默认会保存在<包>/database/文件夹下

//当修改版本号时候,会触发:onUpgrade方法

//第二个:指定数据库名称,

//第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的

游标工厂

//版本号,大于0

}

/**

* 这个方法是在数据库第一次被创建的时候调用的

*/

@Override

public void onCreate(SQLiteDatabase db)

{

//SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例

db.execSQL("CREATE TABLE person (personid integer primary key

autoincrement, name varchar(20))");

//这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写

了varchar(20),也可以写入超过20的内容

}

/**

* 当数据库的版本号变更的时候被调用

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

db.execSQL("alter table person add phone varchar(12) null");

}

}

---------------------------------------------

/DBSQLIte/src/com/credream/service/PersonService.java

package com.credream.service;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.credream.entity.Person;

public class PersonService

{

private DBOpenHelter dbOpenHelter;

public PersonService(Context context){

this.dbOpenHelter=new DBOpenHelter(context);

}

/**

* 添加记录

* @param person

*/

public void save (Person person){

SQLiteDatabase db=dbOpenHelter.getWritableDatabase();

//SQLiteDatabase db2=dbOpenHelter.getWritableDatabase();

//这里获得的数据库实例和db这个数据库实例是一样的,因为数据库有缓存

功能

//在源码里进行了判断,如果得到的数据库实例不为null,并且已经打开,并

且是只读的,那么

//就直接返回这个实例

//dbOpenHelter.getWritableDatabase().execSQL(sql);这里和db.execSQL("作用

是一样的

//db.execSQL("insert into person (name,phone) values

('"+person.getName()+"','"+person.getPhone()+"')");

//上面这种写法是错误的,因为当用户输入cre'dream的时候那么sql语句就成了

//insert into person (name,phone) values

('cre'dream','15066659146')这样会出现sql语法错误

//所以,应该用转义字符

db.execSQL("insert into person (name,phone) values(?,?)",new

Object[]{person.getName(),person.getPhone()});

//db.close();//数据库也可以不关闭,因为这样的话可以提升性能,因为不用频繁的

开关数据库

}

/**

* 删除记录

* @param person

*/

public void delete (Integer id){

SQLiteDatabase db=dbOpenHelter.getWritableDatabase();

db.execSQL("delete from person where personid=?",new Object[]

{id});

}

/**

* 更新记录

* @param person

*/

public void update(Person person){

SQLiteDatabase db=dbOpenHelter.getWritableDatabase();

db.execSQL("update person set name=?,phone=? where

personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()});

}

/**

* 查找记录

* @param id

* @return

*/

public Person find (Integer id){

SQLiteDatabase db=dbOpenHelter.getReadableDatabase();

//getReadableDatabase();这个方法里面调用了getWritableDatabase();

方法,来取得数据库操作实例,只有调用

//失败的时候就会发现异常,当数据磁盘满了,会抛出异常,这时候会打开这

个实例的数据库

//然后开始读取,这样当磁盘满的时候,

//当数据库磁盘空间没有满的时候,返回的数据库操作实例是一样的:可读

可写,当数据库磁盘满了,返回的数据库

//操作实例是只读的

Cursor cursor=db.rawQuery("select * from person where personid=?",new

String[]{id.toString()});

//游标存放结果

if(cursor.moveToFirst()){

int personid=cursor.getInt(cursor.getColumnIndex("personid"));

String name=cursor.getString(cursor.getColumnIndex("name"));

String phone=cursor.getString(cursor.getColumnIndex("phone"));

return new Person(personid,name,phone);

}//当有数据会返回true,否则为false

cursor.close();

return null;

}

//处理分页

/**

* 分页获取记录

* offset:跳过前面几条记录

* maxlength:获取几条

*/

public List<Person> getScrollData(int offset,int MaxResult){

List<Person> persons=new ArrayList<Person>();

SQLiteDatabase db=dbOpenHelter.getReadableDatabase();

Cursor cursor=db.rawQuery("select * from person order by personid asc

limit ?,?",

new String[]{String.valueOf(offset),String.valueOf

(MaxResult)});

while(cursor.moveToNext()){

int personid=cursor.getInt(cursor.getColumnIndex("personid"));

String name=cursor.getString(cursor.getColumnIndex("name"));

String phone=cursor.getString(cursor.getColumnIndex("phone"));

persons.add(new Person(personid,name,phone));

}

cursor.close();

return persons;

}

public long getCount(){

SQLiteDatabase db=dbOpenHelter.getReadableDatabase();

Cursor cursor=db.rawQuery("select count(*) from person " ,null);

//select count(*) from person注意这里至少会获得一条数据

cursor.moveToFirst();

long result=cursor.getLong(0);

return result;

}

}

-----------------------------------------------------------

/DBSQLIte/src/com/credream/test/PersonServiceTest.java

package com.credream.test;

import java.util.List;

import com.credream.entity.Person;

import com.credream.service.DBOpenHelter;

import com.credream.service.PersonService;

import android.test.AndroidTestCase;

import android.util.Log;

public class PersonServiceTest extends AndroidTestCase

{

private static final String TAG="PersonServiceTest";

//创建数据库,在<包>/database/

public void testCreateDB()throws Exception{

DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext());

dbOpenHelter.getWritableDatabase();

}

public void testSave()throws Exception{

PersonService service=new PersonService(this.getContext());

for(int i=0;i<20;i++){

Person person=new Person("lidewei"+i,"15163245754"+i);

service.save(person);

}

}

public void testUpdate()throws Exception{

PersonService service=new PersonService(this.getContext());

Person person=service.find(1);

person.setName("credream");

service.update(person);

}

public void testDelete()throws Exception{

PersonService service=new PersonService(this.getContext());

service.delete(21);

}

public void testFind()throws Exception{

PersonService service=new PersonService(this.getContext());

Person person=service.find(1);

Log.i(TAG,person.toString());

}

public void testScrollData()throws Exception{

PersonService service=new PersonService(this.getContext());

List<Person> persons=
service.getScrollData(5, 5);

for(Person person :persons){

Log.i(TAG,person.toString());

}

//翻到第2页

}

public void testCount()throws Exception{

PersonService service=new PersonService(this.getContext());

long result=service.getCount();

Log.i(TAG, result+"");

}

//除了以上的数据库操作为,还为我们提供了专门方法:

}

------------------------------------------------------------

3.代码写完后在相应的方法上用android junit 进行测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐