Android——使用SQLiteDatabase操作SQLite数据库

除了可以使用文件或 SharedPreferences 存储数据,还可以选择使用 SQLite 数据库存储数据。
Android 平台上,集成了一个嵌入式关系型数据库 SQLite SQLite3 支持  NULL INTEGER REAL (浮点数 字)、 TEXT( 字符串文本 ) BLOB( 二进制对象 ) 数据类型,虽然它支持的类型只有五种,但实际上 sqlite3 也接 varchar(n) char(n) decimal(p,s)  等数据类型,只不过在运算或保存时会转成对应的五种数据类型。   SQLite 最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。 例如:可以在 Integer 类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放 日期型值。   但有一种情况例外:定义为 INTEGER PRIMARY KEY 的字段只能存储 64 位整数,   当向这种字段 保存除整数以外的数据时,将会产生错误。   另外,  SQLite  在解析 CREATE TABLE  语句时,会忽略   CREATE TABLE  语句中跟在字段名后面的数据类型信息,如下面语句会忽略  name 字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite 可以解析大部分标准 SQL 语句,如:
查询语句: select * from  表名  where  条件子句  group by  分组字句  having ... order by  排序子句
如: select * from person
        select * from person order by id desc
        select name from person group by name having count(*)>1
分页 SQL mysql 类似,下面 SQL 语句获取 5 条记录,跳过前面 3 条记录
select * from Account limit 5 offset 3  或者   select * from Account limit 3,5
插入语句: insert into  表名 ( 字段列表 ) values( 值列表 ) 如:  insert into person(name, age) values( 传智 ’,3)
更新语句: update  表名  set  字段名 =  where  条件子句。 如: update person set name= 传智 ‘ where id=10
删除语句: delete from  表名  where  条件子句。 如: delete from person  where id=10
l
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使 用到了 SQLite 数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另 外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在 用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库 表吧?因为这种需求是每个数据库应用都要面临的,所以在 Android 系统,为我们提供了一个名为 SQLiteOpenHelper 的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理, SQLiteOpenHelper 类提供了两个重要的方法,分别是 onCreate(SQLiteDatabase db) onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) ,前者用于初次使用软件时生成数据库表,后者用 于升级软件时更新数据库表结构。当调用 SQLiteOpenHelper getWritableDatabase() 或者 getReadableDatabase() 方法获取用于操作数据库的 SQLiteDatabase 实例的时候,如果数据库不存在, Android 系统会自动生成一个数据库, 接着调用 onCreate() 方法, onCreate() 方法在初次生成数据库时才会被调用,在 onCreate() 方法里 可以生成数据库表 结构及添加一些应用使用到的初始化数据 onUpgrade() 方法 在数据库的版本发生变化时会被调用,一般在软件升级 时才需改变版本号 ,而数据库的版本是由程序员控制的,假设数据库现在的版本是 1 ,由于业务的变更,修改了数据 库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原 来的数据库版本设置为 2( 有同学问设置为 3 行不行?当然可以,如果你愿意,设置为 100 也行 ) ,并且在 onUpgrade() 方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在 onUpgrade() 方法里面可以根据原版号和目标版 本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase() getReadableDatabase() 方法都可以获取一个用于操作数据库的 SQLiteDatabase 实例。但 getWritableDatabase()  方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若 使用的是 getWritableDatabase()  方法就会出错。 getReadableDatabase() 方法先以读写方式打开数据库,如果数据库 的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
l
public class DatabaseHelper extends SQLiteOpenHelper {
    // 类没有实例化 , 是不能用作父类构造器的参数 , 必须声明为静态
          private static final String name = "itcast";   // 数据库名称
          private static final int version = 1 ; / / 数据库版本
         public DatabaseHelper(Context context) {
// 第三个参数 CursorFactory 指定在执行查询时获得一个游标实例的工厂类 , 设置为 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() 方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。一般 在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据 不会丢失。
l




==================================================================================
  /**

 * @author Administrator yangchao

 *为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,

 *分别是onCreate(SQLiteDatabase db)onUpgrade(SQLiteDatabase dbint 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, DatabaseNamenullDatabaseVersion);

    } 

    /*

     * 用于初次使用软件时生成数据库表

     */

    @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());

       /*

        * 当调用SQLiteOpenHelpergetWritableDatabase()或者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()

    {

    }

}

 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值