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数据库,其内容如下
Android内部是如何创建数据库的呢?当.getReadableDatabase() 或者 .getWritableDatabase() 方法被调用时,数据库会被自动创建,SQLiteOpenHelper内部的getWritableDatabase()的方法中有以下代码
注意:系统默认的数据库版本号是0。运行时会得到当前数据的版本号,不等于系统默认的版本号,就会开始事务,如果是0,说明是第一次运行,就会创建数据库,如果版本号大于新的版本号,是降级,执行onDowngrade(db, version, mNewVersion)方法,如果版本号小于新的版本号,说明是升级,执行onUpgrade(db, version, mNewVersion),而不管是降级还是升级,都会用新的版本号代替原来的版本号,以此实现循环。
例如当修改DBOpenHelper类中的OpenHelper方法的版本号,如
从新运行测试方法,就会得到添加了phone字段的新的数据库
就可以说明,当修改版本号是,会执行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 |
转载于:https://blog.51cto.com/020618/1386854