Android中使用嵌入式关系型SQLite数据库存储数据,SQLite支持NULL,INTEGER,REAL(浮点数据),TEXT(字符串文本)和BLOB(二进制对象) 五种数据类型,虽然它支持的类型只有五种,但是它也接受varchar(n)、char(n)、decimal(p,s)等数据类型(见附件),只不过在应用或保存的时候会转化为五种类型之一。

   SQLite最大的特点是(无数据类型特点)——你可以把各种类型的数据保存到任何字段中,而不用关心字段申明的数据类型是什么。例如:可以再Integer类型的字段中存放字符串,或者在布尔字段中存放浮点数,或者在字符型字段中存放日期类型值。

   但是有一种情况例外:定义为INTEGER PRIMARY KEY(主键)的字段智能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。另外,在编写CREATE TABLE语句时,可以省略跟在字段名称后面的数据类型信息。

   下面看一下在Android应用中数据库的创建过程

1.新建一个Android应用,在业务层建DBOpenHelper类继承SQLiteOpenHelper,代码如下


public class DBOpenHelper extends SQLiteOpenHelper {
    public DBOpenHelper(Context context) {
        super(context, "hao.db", null, 1);//数据库名称及版本号
    }
    @Override
    public void onCreate(SQLiteDatabase db) {//是在数据库第一次被创建的时候被调用
        //生成应用所需要的数据表,SQLiteDatabase数据库封装实例
        String sqlCre= "CREATE TABLE person(personid INTEGER PRIMARY KEY autoincrement,name carchar(20))";
        db.execSQL(sqlCre);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //在数据库文件的版本号发生变更时被调用,比如要额外添加一个字段,修改上面的版本号
    String sqlUp = "ALTER TABLE person ADD phone VARCHAR(12) null";//增加phone字段
    db.execSQL(sqlUp);
    }
}

   其中onCreate()和onUpdate()方法是系统自动添加的。

2.新建一个PersonServiceTest测试方法,代码如下


public class PersonServiceTest extends AndroidTestCase {
    public void testCreateDb() throws Exception{
        DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());
        dbOpenHelper.getWritableDatabase();
    }
}

   当执行该方法时,就会在当前应用的databases路径下创建hao.db数据库,打开hao.db数据库,其内容如下


wKiom1M3qVeDMqSiAAFeNbzMaO8418.jpg

   Android内部是如何创建数据库的呢?当.getReadableDatabase() 或者 .getWritableDatabase() 方法被调用时,数据库会被自动创建,SQLiteOpenHelper内部的getWritableDatabase()的方法中有以下代码

wKioL1M3qpfS-vtEAAHF8Xfzcr4364.jpg

注意:系统默认的数据库版本号是0。运行时会得到当前数据的版本号,不等于系统默认的版本号,就会开始事务,如果是0,说明是第一次运行,就会创建数据库,如果版本号大于新的版本号,是降级,执行onDowngrade(db, version, mNewVersion)方法,如果版本号小于新的版本号,说明是升级,执行onUpgrade(db, version, mNewVersion),而不管是降级还是升级,都会用新的版本号代替原来的版本号,以此实现循环。

   例如当修改DBOpenHelper类中的OpenHelper方法的版本号,如

wKioL1M3rYSxsgR6AACEL5CtJ_U377.jpg

   从新运行测试方法,就会得到添加了phone字段的新的数据库


wKiom1M3rlvzD4O9AAGZvymD0wo008.jpg

   就可以说明,当修改版本号是,会执行onUpdate()方法。

附件:SQLite支持的数据类型

Declared type


Mapped to internal data type


Description


DEC


Float


Floating-point numeric field (8 bytes)


DECIMAL


Float


Floating-point numeric field (8 bytes)


DOUBLE


Float


Floating-point numeric field (8 bytes)


DOUBLEPRECISION


Float


Floating-point numeric field (8 bytes)


FLOAT


Float


Floating-point numeric field (8 bytes)


NUMERIC


Float


Floating-point numeric field (8 bytes)


REAL


Float


Floating-point numeric field (8 bytes)


INT


Largeint


64-bit integer field


INTEGER


Largeint


64-bit integer field


SMALLINT


Largeint


64-bit integer field


TINYINT


Largeint


64-bit integer field


WORD


Largeint


64-bit integer field


AUTOINC


Largeint


64-bit integer field


BIGINT


Largeint


64-bit integer field


LARGEINT


Largeint


64-bit integer field


INT64


Largeint


64-bit integer field


CHAR


WideString


Wide string field


VARCHAR


WideString


Wide string field


VARCHAR2


WideString


Wide string field


TEXT


WideString


Wide string field


DATETEXT


WideString


Wide string field


NCHAR


WideString


Wide string field


NVARCHAR


WideString


Wide string field


NVARCHAR2


WideString


Wide string field


NTEXT


WideString


Wide string field


CURRENCY


Currency


Money field (8 bytes)


MONEY


Currency


Money field (8 bytes)


SMALLMONEY


Currency


Money field (8 bytes)


BLOB


Blob


Binary Large Object field


RAW


Blob


Binary Large Object field


BINARY


Blob


Binary Large Object field


VARBINARY


Blob


Binary Large Object field


CLOB


WideMemo


Text wide memo field


MEMO


WideMemo


Text wide memo field


DATE


Date


Date field (Borland TDateTime)


TIME


Time


Time field (Borland TDateTime)


DATETIME


DateTime


Date and time field (Borland TDateTime)


TIMESTAMP


DateTime


Date and time field (Borland TDateTime)


BOOLEAN


Boolean


Boolean field


GRAPHIC


Graphic


Graphic field