Android 数据存储之SQLite

来源:互联网 发布:java ee的jdk 编辑:程序博客网 时间:2024/05/16 17:59

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主流的操作系统运行。支持高达2TB大小的数据库,以单个文件的形式存在,以B-Tree的数据结构形式存储在磁盘上。

特点主要包括:

1、轻量级 一个动态库 单文件。
2、独立性 没有依赖 无需安装。
3、隔离性 全部在一个文件夹中。
4、跨平台 支持众多主流操作系统。
5、多语言接口 支持众多编程语言。
6、安全性,事务。
7、无帐号管理,无网络支持。

关于事务处理的安全性问题:

1、通过数据库上的独占性和共享锁来实现独立事务处理。
2、多个进程可以在同一时间从同一数据库访问数据,但在同一时刻只能有一个写入数据。


关于SQLite的数据类型:

SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型。依次代表:空值,整型值,浮点型,字符型,二进制对象。

布尔数据类型:

   SQLite并没有提供专门的布尔存储类型,取而代之的是存储整型1表示true,0表示false。


日期和时间数据类型:

和布尔类型一样,SQLite也同样没有提供专门的日期时间存储类型,而是以TEXT、REAL和INTEGER类型分别不同的格式表示该类型,如:
    TEXT: "YYYY-MM-DD HH:MM:SS.SSS"
    INTEGER: 以Unix时间形式保存数据值,即从1970-01-01 00:00:00到当前时间所流经的秒数。


动态数据类型(弱引用):

当某个值插入到数据库时,SQLite将会检查它的数据类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列对应的数据类型,如果不能转换,则该值将作为本身的类型存储。


进入主题:


如何通过Android API 操作SQLite数据库:

1、创建或打开数据库

//如果数据库存在,就打开,否则创建
context.openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory)
参数:
name 数据库名称
mode
  MODE_PRIVATE 默认模式,值为0,文件只可以被调用该方法的应用程序访问
MODE_WORLD_READABLE            所有的应用程序都具有对该文件读的权限。
MODE_WORLD_WRITEABLE            所有的应用程序都具有对该文件写的权限。
factory:    当query方法被调用时,用来实例化cursor,通常为null。
创建成功后会返回一个SQLiteDatabase对象,通过SQLiteDatabase对象完成数据库的表创建,增,删,改,查操作。

2、关闭数据库

对数据库操作完毕之后,就要关闭数据库,否则会抛出SQLiteException异常。关闭数据库只需调用成SQLiteDatabase对象的.close()方法即可。

3、删除数据库

直接调用context.deleteDatebase()方法即可

1、数据库操作示例1(直接发送SQL语句):

//每个程序都有自己的数据库 默认情况下是各自互相不干扰//创建一个数据库,如果没有就创建,否则打开SQLiteDatabase db =  context.openOrCreateDatabase("user.db", MODE_PRIVATE, null);//创建表db.execSQL("create table if not exists user (_id integer primary key autoincrement, name text not null , age integer not null , sex text not null )");db.execSQL("insert into usertb(name,sex,age) values('张三','女',18)");//使用事务db.beginTransaction();//开始事务try {db.execSQL("insert into usertb(name,sex,age) values('李四','女',19)");db.execSQL("insert into usertb(name,sex,age) values('王五','男',20)");    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务} finally {    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务} //查询Cursor c = db.rawQuery("select * from user", null);if (c!=null) {while (c.moveToNext()) {Log.i("info", "_id:"+c.getInt(c.getColumnIndex("_id")));Log.i("info", "name:"+c.getString(c.getColumnIndex("name")));Log.i("info", "age:"+c.getInt(c.getColumnIndex("age")));Log.i("info", "sex:"+c.getString(c.getColumnIndex("sex")));Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");}c.close();}db.close();


2、数据库操作示例2:

import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);SQLiteDatabase db = openOrCreateDatabase("stu.db", MODE_PRIVATE, null);db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");ContentValues values = new ContentValues();values.put("name", "张三");values.put("sex", "男");values.put("age", 19);long rowId = db.insert("stutb", null, values);values.clear();values.put("name", "张三丰");values.put("sex", "男");values.put("age", 99);db.insert("stutb", null, values);values.clear();values.put("name", "张三疯");values.put("sex", "男");values.put("age", 59);db.insert("stutb", null, values);values.clear();values.put("name", "张三峰");values.put("sex", "男");values.put("age", 39);db.insert("stutb", null, values);values.clear();values.put("name", "张三封");values.put("sex", "男");values.put("age", 29);db.insert("stutb", null, values);values.clear();values.put("sex", "女");db.update("stutb", values, "_id>?", new String[]{"3"});//将全部id>3的人的性别改成女db.delete("stutb", "name like ?", new String[]{"%丰%"});//删除所有名字中带有丰的人Cursor c = db.query("stutb", null, "_id>?", new String[]{"0"}, null, null, "name");if (c!=null) {String [] columns= c.getColumnNames();while (c.moveToNext()) {for (String columnName : columns) {Log.i("info", c.getString(c.getColumnIndex(columnName)));}}c.close();}db.close();}}

通过Android提供的SQLiteOpenHelper类,来创建打开数据库,编写一个DBOpenHelper类,继承之SQLiteOpenHelper。

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper{public DBOpenHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Override//首次创建数据库的时候调用,值调用一次, 一般可以把建库 建表的操作public void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");db.execSQL("insert into stutb(name,sex,age)values('张三','女',18)");}@Override//当数据库的版本发生变化的时候 会自动执行public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}

DBOpenHelper helper =new DBOpenHelper(context, "stu.db");//helper.getReadableDatabase();//获取一个只读的数据库 只能查询 不能写入 不能更新SQLiteDatabase db = helper.getWritableDatabase();//db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)Cursor c = db.rawQuery("select * from stutb", null);if (c!=null) {String [] cols = c.getColumnNames();while (c.moveToNext()) {for (String ColumnName : cols) {Log.i("info", ColumnName+":"+c.getString(c.getColumnIndex(ColumnName)));}}c.close();}db.close();




0 0
原创粉丝点击