Android-使用嵌入式SQLite
Android平台上集成的一个嵌入式关系型数据库,SQLite3支持 NULL,INTEGER,REAL(浮点数
字),TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上
sqlite3也接受varchar(n),char(n),decimal(p,s) 等数据类型,只不过在运算或保存时会转
成对应的五种数据类型.
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是
什么. 但定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外
的数据时,将会产生错误.
另外, SQLite在解析CREATE TABLE语句时,会忽略字段名后面的数据类型信息.
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from .. where group by ..having ... order by 排序子句
SQLite分页同mysql相同:
... limit 5 offset 3 | limit 3,5
首次使用数据库需要创建表及初始化一些信息,升级时需要修改表信息,android提供了SQLiteOpenHelper完成此类功能
onCreate(SQLiteDatabase db)方法用于首次使用时创建库,onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)方法检测版本变化时更新库
getWriteableDatabase()和getReadableDatabase()方法获取一个用于操作数据库的SQLiteDatabase实例。
getWriteableDatabase()方法一读写方式打开数据库,一旦数据库的磁盘空间满了,数据库只能读而不能写。倘若使用getWriteableDatabase()打开数据库就会出错。getReadableDatabase()方法以读方式打开数据库。
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String name = "itcast";//数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context){
Super(context,name,null,version);
}
public void onCreate(){
//drop table if exists customers
//create table if not exists customers(...
db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
public void onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion){
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL");
}
}
在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失。
使用SQLiteDataBase数据库
SQLiteDatabase db = ....;
db.execSQL("insert into person(name,age) values(?,?)",new Object[]{..});
db.close();
//查询操作
Cursor cursor = db.rawQuery("select * from person", null);
while(cursor.moveToNext){
int personid = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
cursor.close();
Db.close();
}
cursor.close();
db.close();
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
Values.put("name","传智播客");
.....
Long rowid = db.insert("person",null,values);
//删除
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("person","personid<?",new String[]{"2"}">");
db.close();
//更新
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//key为字段名,value为值
values.put("name","传智播客");
db.update("person",values,"personid=?",new String[]{"1"});
db.close();
注:第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper
会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以在你不需要SQLiteDatabase实例时,请及时调用close()方法释放资源,一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例。
事务处理:
SQLiteDatabase db = ...;
db.beginTransaction();
Try{
db.execSQL(...)
db.execSQL(...);
//设置成功标记
db.setTransactionSuccessful();
}catch(){
....
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务。
}
db.close(); www.zzzyk.com
注意:创建表时,只能用integer类型,不能用int作为主键,否则不支持autoincrement.
create table customers(id integer primary key autoincrement,name text);
作者:toto1297488504
补充:移动开发 , Android ,