Android数据库Sqlite的基本用法及升级策略

一 SQLite简介

SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java、C++、.Net等,还有ODBC接口,同样比起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

二 SQLite数据类型

一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL: 这个值为空值

VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.

REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小时、分钟、秒。

三 数据库SQL增删改查

查找
select column1,column2 from table_name 

或者

select * from table_name
插入
insert into table_name(column1,column2) values (value1,value2)
更新

更新已有表的数据:

update table_name set column1 = value1, column2 = value2
where +条件语句

向表中插入列:

alter table table_name add column column_name text(varchar(10)、char等)
删除
delete from table_name where +条件语句

注:sql语句不区分大小写

四 数据库创建

  • 创建数据库

首先创建一个类去继承SQLiteOpenHelper,创建一个test.db的数据库

public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "test.db";
    public static final int DB_VERSION = 1;


    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DBDao.SQL_CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    }
}

其中onCreate()是在数据库首次创建的时候调用,onUpgrade()是在数据库版本号DB_VERSION升级的时候才会调用

  • 增删改查
public class DBDao {
    public static final String TABLE_NAME = "student";//表名
    private static final String ID = "id";//id自增长
    private static final String NAME = "stu_name";//姓名
    private static final String AGE = "stu_age";//年龄
    private static final String SEX = "stu_sex";//性别
    private static final String GRADE = "stu_grade";//年级
    //DB_Version2增加新字段
    private static final String SCORE = "store";

    private DBHelper dbHelper;

    //创建表结构
    public static final String SQL_CREATE_TABLE = "create table " + TABLE_NAME + "(" +
            ID + " integer primary key autoincrement," +
            NAME + " text," +
            AGE + " integer," +
            SEX + " varchar(5)," +
            GRADE + " text" +
            ")";


    private DBDao() {
        dbHelper = new DBHelper(MyApplication.getContext());
    }

    public static DBDao getInstance() {
        return InnerDB.instance;
    }

    private static class InnerDB {
        private static DBDao instance = new DBDao();
    }

    /**
     * 数据库插入数据
     *
     * @param bean 实体类
     * @param <T>  T
     */
    public synchronized <T> void insert(T bean) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        try {
            if (bean != null && bean instanceof Student) {
                Student student = (Student) bean;
                ContentValues cv = new ContentValues();
                cv.put(NAME, student.getName());
                cv.put(AGE, student.getAge());
                cv.put(SEX, student.getSex());
                cv.put(GRADE, student.getGrade());
                cv.put(SCORE, student.getStore());
                db.insert(TABLE_NAME, null, cv);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.close();
        }
    }

    /**
     * 删除表中所有的数据
     */
    public synchronized void clearAll() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "delete from " + TABLE_NAME;

        try {
            db.execSQL(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.close();
        }
    }

    /**
     * 查询数据
     *
     * @return List
     */
    public synchronized <T> List<T> query() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        List<T> list = new ArrayList<>();
        String querySql = "select * from " + TABLE_NAME;
        Cursor cursor = null;
        try {
            cursor = db.rawQuery(querySql, null);
            while (cursor.moveToNext()) {
                Student student = new Student();
                student.setName(cursor.getString(cursor.getColumnIndex(NAME)));
                student.setAge(cursor.getInt(cursor.getColumnIndex(AGE)));
                student.setSex(cursor.getString(cursor.getColumnIndex(SEX)));
                student.setGrade(cursor.getString(cursor.getColumnIndex(GRADE)));
                student.setStore(cursor.getString(cursor.getColumnIndex(SCORE)));
                list.add((T) student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return list;
    }
    
}
  • 创建实体类
public class Student {
    private String name;
    private int age;
    private String grade;
    //Version2添加
    private String sex;

    public String getStore() {
        return store;
    }

    public void setStore(String store) {
        this.store = store;
    }

    private String store;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Student() {
    }

    public Student(String name, int age, String grade, String sex,String store) {
        this.name = name;
        this.age = age;
        this.grade = grade;
        this.sex = sex;
        this.store=store;
    }
}
  • 执行数据库操作:
Student student = new Student("小明", 20, "三年二班", "man");
DBDao.getInstance().insert(student);

insert()方法中调用了dbHelper.getWritableDatabase(),此时没有test.db数据库则会去创建,接着执行onCreate()去创建了student表并插入了一条数据,去data/data/package_name/databases下查看发现test.db已经被创建好了,并且表中已经有了插入的数据,如下:

S71029-14273028.jpg
到此我们已经完成了基本的数据库创建过程。

五 数据库升级

在版本迭代的过程中,我们难免不了要去改变我们数据库的内容,此时就要考虑我们的数据库升级问题了,假如此时我们有个需求,要在新的版本中在数据库表中新加一个字段,首先我们要把DB_VERSION提升到2,那么安装新版本APK的时候就会执行onUpdate()操作去执行更新操作,那么我们直接把更新的操作放到onUpdate()就可以了吗?当然不行!我们要考虑各个版本的情况,比如用户没有安装过1.0版本,直接安装的2.0版本,那么这种情况是不会执行onUpdate()方法的,以后有了3.0、4.0版本,逻辑将更复杂,所以单纯的放到onUpdate()中是不可行的,还有一种方式:

  @Override
  public void onCreate(SQLiteDatabase database) {
      database.execSQL(DBDao.SQL_CREATE_TABLE);
  }

  @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    	try {
    		db.execSQL("DROP TABLE IF EXISTS student");
            this.onCreate(db);
		} catch (Exception e) {
		}
        
    }

这种的在更新时直接把原来的表删除掉然后手动去调onCreate()去重建表,个人觉得不够优雅,首先老数据会丢失,假如要手动保存,表中数据量大时操作起来也不方便,那么有没有更好一些的方法呢?看下面这种方式:

    private static final String DB_NAME = "test.db";
    public static final int DB_VERSION = 2;

    @Override
    public void onCreate(SQLiteDatabase database) {
        int initDBVersion = 1;
        DataBaseHelper.initDB(database);
        onUpgrade(database, initDBVersion, DB_VERSION);
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
                case 1:
                    DataBaseHelper.upToDbVersion2(database);
                    break;
                case 2:
                    DataBaseHelper.upToDbVersion3(database);
                    break;
                default:
                    break;
            }
        }
    }

如果用户是从1.0升到2.0的,那么会直接执行onUpdate(),此时oldVersion是1,执行for循环中的DataBaseHelper.upToDbVersion2(database),如果用户没有装过1.0版本而是直接安装的2.0版本,那么会执行onCreate()方法,在onCreate()中手动调用的onUpdate()方法去执行更新操作,这样就兼容到了各种需求,同时升级到3.0、4.0版本都是可以兼容的,比如在2.0时想在原有表中新加一列:

 public static void upToDbVersion2(SQLiteDatabase database) {
     String updateSql = "alter table " + DBDao.TABLE_NAME + " add column store varchar(5)";
     database.execSQL(updateSql);
 }

S71029-14285063.jpg
升级到3.0时想把列store中的值全改成100:

 public static void upToDbVersion3(SQLiteDatabase database) {
     ContentValues values = new ContentValues();
     values.put("store", 100);
     database.update(DBDao.TABLE_NAME, values, null, null);
 }

S71029-14580506.jpg

实验结果可知,各种情况都可以兼容,个人觉得这种方案更好一些,注意数据库的版本号只能升级,不能降级,例如不能将数据库版本号从2降到1:

Caused by: android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1

源码地址:http://download.csdn.net/download/u013700502/10043778

六 参考

【1】http://www.w3school.com.cn/sql/index.asp
【2】http://www.runoob.com/sqlite/sqlite-update.html
【3】 http://blog.csdn.net/codeeer/article/details/30237597/

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android中的SQLite数据库是一种轻量级的数据库,它可以在Android应用程序中存储和检索数据。SQLite数据库使用SQL语言来管理数据,可以在Android应用程序中创建、读取、更新和删除数据。使用SQLite数据库可以使应用程序更加高效和可靠,因为它可以在本地存储数据,而不需要访问网络。在Android中使用SQLite数据库需要使用SQLiteOpenHelper类来创建和管理数据库SQLiteOpenHelper类提供了一些方法来创建和升级数据库,以及插入、查询、更新和删除数据。在使用SQLite数据库时,需要注意数据类型、表结构、SQL语句等方面的问题,以确保数据的正确性和完整性。 ### 回答2: Android平台经常使用SQLite数据库来存储和管理本地数据。在本文中,我们将讨论如何在Android中使用SQLite数据库。 首先,在Android中使用SQLite数据库,我们需要创建一个SQLiteOpenHelper类。这个类用于创建和升级数据库。它包含了两个重要的方法:onCreate()和onUpgrade()。onCreate()方法将在首次创建数据库时被调用。onUpgrade()方法将在升级数据库时被调用。我们可以在这个类中定义表名,列名,数据库版本号和其他数据库相关信息。 接下来,在我们使用数据库前,需要实例化一个SQLiteOpenHelper类对象。这个对象用于打开或创建数据库。我们可以使用getReadableDatabase()和getWritableDatabase()方法来获取一个可读/写的数据库对象。 在获取数据库对象后,我们可以执行SQL命令来操作数据库。我们可以使用execSQL()方法来执行SQL命令。我们可以使用insert()、update()和delete()方法来执行增、删、改操作。我们可以使用rawQuery()方法来执行查询操作。 SQLiteOpenHelper类和SQLiteDatabase类并不是线程安全的。因此我们需要确保在使用时进行同步操作。我们可以使用synchronized关键字来达到同步效果。 在Android中,许多第三方的开源框架,如OrmLite、GreenDao和Realm等,提供了ORM(对象关系映射)的功能,使得数据库的操作更加简单和便捷。 总的来说,在Android中使用SQLite数据库可以轻松地存储和管理本地数据。SQLiteOpenHelper和SQLiteDatabase提供了丰富的API来操作数据库。ORM框架为我们提供了更加简便的数据库操作方式。因此,掌握AndroidSQLite数据库的使用非常重要。 ### 回答3: Android SQLite数据库Android开发中最常用的数据库之一,它是一个基于文件的嵌入式关系数据库管理系统。SQLite在设计时考虑到了资源占用和运行效率,所以非常适合在移动设备上使用。下面将详细介绍如何使用Android SQLite数据库。 1. 创建数据库 首先需要创建一个SQLite数据库,通过SQLiteOpenHelper类来创建,传入的参数主要是数据库版本号和数据库名称。在SQLiteOpenHelper的子类中重写onCreate方法来创建表格和一些初始化操作。 2. 执行SQL语句 在SQLiteOpenHelper的子类中重写onUpgrade方法来执行升级操作,可以通过执行ALTER TABLE语句来修改表格结构,并通过DROP TABLE语句删除表格。除此之外,在应用中也可以通过SQLiteDataBase对象的execSQL方法来执行SQL语句,如插入、删除或修改数据等。 3. 增删改查操作 增加(insert):通过SQLiteDataBase对象的insert方法来实现,在方法中传入表名和map对象,map对象中存储数据的键值对。 删除(delete):同样通过SQLiteDataBase对象的delete方法来实现,传入表名和删除条件。 修改(update):也是通过SQLiteDataBase对象的update方法来实现,同时传入修改的数据及条件。 查询(query):同样通过SQLiteDataBase对象的query方法来实现,传入要查询的表名、查询的列、查询条件等参数即可。 4. 事务操作 SQlite数据库支持事务操作,可以在一组操作中,只要有一个操作出现问题,就可以将之前的操作全部回滚,以保证数据的完整性和一致性。 以上就是android-sqlite数据库的使用方法,当然还有很多细节需要注意,例如:表格的设计、SQL语句的优化等。熟练掌握SQLite的使用,可以帮助开发者更好地管理应用数据,提高应用性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小马快跑_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值