标签:
那么。我们怎样才干实如今用户初次使用或升级软件时自己主动在
用户的手机上创建出应用须要的数据库表呢?总不能让我们在每一个须要安装此软件的手机上通过手工方式创建数据库表吧?由于这种需求是每一个数据库应用都要面临的。所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类。必须继承它才干使用,它是通过对数据库版本号进行管理来实现前面提出的需求。当调用
SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候。假设数据库不存在,Android系统会自己主动生成一个数据库。接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里能够生成数据库表结构及加入一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本号发生变化时会被调用,一般在软件升级时才需改变版本号号,而数据库的版本号是由程序猿控制的,假设数据库如今的版本号是1,因为业务的变更,改动了数据库表结构,这时候就须要升级软件,升级软件时希望更新用户手机里的数据库表结构。为了实现这一目的。能够把原来的数据库版本号设置为2(有同学问设置为3行不行?当然能够,假设你愿意,设置为100也行),而且在onUpgrade()方法里面实现表结构的更新。当软件的版本号升级次数比較多。这时在onUpgrade()方法里面能够依据原版号和目标版本号进行推断,然后作出对应的表结构及数据更新。但
getWritableDatabase() 方法以读写方式打开数据库。一旦数据库的磁盘空间满了,数据库就仅仅能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,假设数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以仅仅读方式打开数据库。* @author Administrator yangchao
*为了实现对数据库版本号进行管理,SQLiteOpenHelper类提供了两个重要的方法。
*各自是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
*/
public class DBOpenHelper extends SQLiteOpenHelper
{
private static final String DatabaseName = "test.db";//数据库的名称
private static final int DatabaseVersion = 1;//数据库的版本
public DBOpenHelper(Context context)
{
super(context, DatabaseName, null, DatabaseVersion);
}
/*
* 用于初次使用软件时生成数据库表
*/
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE person (personId integer primary key autoincrement, name varchar(20))");
}
/*
* 用于升级软件时更新数据库表结构。
* 仅仅有在数据库版本号发生改变时 才会被调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
------------------------------------------------------------------------------------------------------------------------------------
public class PersonService
{
DBOpenHelper dbOpenHelper;
public PersonService(){}
public PersonService(Context context)
{
this.dbOpenHelper = new DBOpenHelper(context);
}
/**
* 保存方法
* @param person
*/
public void save(Person person)
{
SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
String sql = "insert into person(personId, name) values(?, ?
)";
database.execSQL(sql, new Object[]{person.getPersonId(), person.getName()});
}
/**
* 更改方法
* @param person
*/
public void update(Person person)
{
SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
String sql = "update person set name=? where personId=?";
database.execSQL(sql, new Object[]{person.getName(), person.getPersonId()});
}
/**
* 删除方法
* @param person
*/
public void delete(Person person)
{
SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
String sql = "delete from person where personId=?";
database.execSQL(sql, new Object[]{person.getPersonId()});
}
/**
* 查找单个记录
* @param id
* @return
*/
public Person find(Integer id)
{
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
String sql = "select * from person where personId = ?
";
Cursor cursor = database.rawQuery(sql, new String[]{id.toString()});
if(cursor.moveToFirst())
{
String name = cursor.getString(cursor.getColumnIndex("name"));
int personId = cursor.getInt(cursor.getColumnIndex("personId"));
return new Person(personId, name);
}
return null;
}
/**
* 分页查找
* @param offset
* @param maxResult
* @return
*/
public List<Person> getScrollData(Integer offset, Integer maxResult)
{
List<Person> persons = new ArrayList<Person>();
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
String sql = "select * from person limit ?
, ?";
Cursor cursor = database.rawQuery(sql, new String[]{offset.toString(), maxResult.toString()});
while(cursor.moveToNext())
{
int personId = cursor.getInt(cursor.getColumnIndex("personId"));
String name = cursor.getString(cursor.getColumnIndex("name"));
persons.add(new Person(personId, name) );
}
return persons;
}
/**
* 获取总记录数
* @return
*/
public long getCount()
{
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
String sql = "select count(*) from person";
Cursor cursor = database.rawQuery(sql, null);
cursor.moveToFirst();
return cursor.getLong(0);
}
}
====================================測试======================================
public class DBTest extends AndroidTestCase
{
private static final String TAG = "DBTest";
public void testCreateDB()
{
DBOpenHelper helper = new DBOpenHelper(this.getContext());
/*
* 当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取
* 用于操作数据库的SQLiteDatabase实例的时候,假设数据库不存在,Android系统会自己主动生成一个数据库。
* 接着调用onCreate()方法
*/
helper.getWritableDatabase();
}
public void testSava() throws Exception
{
PersonService service = new PersonService(this.getContext());
service.save(new Person(1, "杨超"));
service.save(new Person(2, "杨超1"));
service.save(new Person(3, "杨超2"));
}
public void testDelete()
{
}
public void testFind()
{
PersonService service = new PersonService(this.getContext());
Person person = service.find(4);
Log.i(TAG, person.toString());
}
public void testFenye()
{
}
public void testCount()
{
}
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
Android——采用SQLiteDatabase操作SQLite数据库
标签:
原文地址:http://www.cnblogs.com/hrhguanli/p/4830567.html