博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android——采用SQLiteDatabase操作SQLite数据库
阅读量:5879 次
发布时间:2019-06-19

本文共 7492 字,大约阅读时间需要 24 分钟。

除了能够使用文件或
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()

    {

    }

}

 

版权声明:本文博主原创文章。博客,未经同意不得转载。

你可能感兴趣的文章
Eclipse集成javap查看字节码
查看>>
一道模拟题:改进的Joseph环
查看>>
Linux SNMP oid
查看>>
Atitit 教育与培训学校 的计划策划 v2
查看>>
Lind.DDD.LindAspects方法拦截的介绍
查看>>
【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
查看>>
Maven依赖版本冲突的分析及解决小结
查看>>
你好,2017!
查看>>
冷备手工完全恢复(recover database,recover tablespace,recover datafile)
查看>>
JS 在火狐浏览器下关闭弹窗
查看>>
MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回...
查看>>
Linux ad7606 驱动
查看>>
安装 RabbitMQ C#使用-摘自网络(包括RabbitMQ的配置)
查看>>
Linux 防火墙iptables命令详解
查看>>
JAVA入门[6]-Mybatis简单示例
查看>>
Spring定时任务的几种实现
查看>>
ZoomIt(投影演示辅助软件)下载、安装与运行使用
查看>>
IntelliJ IDEA JRebel Maven Tomcat 实现热部署
查看>>
Java通过join方法来暂停当前线程
查看>>
Java中的Set
查看>>