Android-使用嵌入式SQLite

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toto1297488504/article/details/7737064

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();

注意:创建表时,只能用integer类型,不能用int作为主键,否则不支持autoincrement.

create table customers(id integer primary key autoincrement,name text);

展开阅读全文

没有更多推荐了,返回首页