zoukankan      html  css  js  c++  java
  • Android——采用SQLiteDatabase操作SQLite数据库

    除了能够使用文件或SharedPreferences存储数据。还能够选择使用SQLite数据库存储数据。
    Android平台上,集成了一个嵌入式关系型数据库SQLiteSQLite3支持 NULLINTEGERREAL(浮点数字)、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
    分页SQLmysql类似,以下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),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

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

           /*

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

        {

        }

    }

     







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

  • 相关阅读:
    Android 沉浸式状态栏的三种实现方式
    大数据量高并发访问的数据库优化方法(一)
    Spring Boot实战:集成Swagger2
    JVM学习之GC常用算法
    java并发面试题
    Java面试处理高并发
    jedis操作redis的几种常见方式总结
    彻底理解数据库事物
    Java集合——HashMap、HashTable以及ConCurrentHashMap异同比较
    HashMap的工作原理
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4830567.html
Copyright © 2011-2022 走看看