14 数据存储-SQLite

数据库存储
受性能以及手机屏幕限制,Android不采用大型数据库作为存储,采用第三方,使用C语言开发
的SQLite数据库.关于SQLite数据库的介绍,详见百度。

ACID:数据库事务,原子性,一致性,独立性和持久性

sqlite.exe 或 sqlite.dll

Android连接SQLite数据库,需要继承SQLiteOpenHelper抽象类,重写onCreate/onUpgreade方法

onCreate:当数据库不存在时会调用该方法,一般用于建立数据库表结构等操作
onUpgreade:当涉及数据库更新时重写该方法,需要提供版本号


SQLiteDatabase getReadableDatabase(); 获取一个读的SQLite数据库

SQLiteDatabase getWriteableDatabase();获取一个写的SQLite数据库


构造方法
SQLiteOpenHelper(Context ctx,String name,SQLiteDatabase.CursorFactory fac,int version)

version代表当前数据库的版本号,从1开始

---------------------------------------------------------------------
ORM:对象/关系映射,在面向对象语言开发过程中,经常要与数据库进行交互,为了将关系型数据库中
数据正常用程序结构来表达,使用table-->class table Row ----> class object

放大到开发设计时:
正向工程:class----table 先设计程序结构,再设计数据存储
逆向工程:table----class 先设计数据存储,再设计类



SQLiteDataBase
android提供用于访问SQLite数据库的类,定义了一系列的方法
静态方法用于打开并获取数据库

static SQLiteDataBase create()

static SQLiteDataBase openCreate()

static SQLiteDataBase openOrCreate()

在获取SQLiteDataBase的对象时,必须传入其内部类对象CursorFactory的对象,可传入null使用内部的默认实现

操作数据库方法
增,删,改
long insert()
long update()
long delete()

在进行insert/update时,需要借助android.content.ContentValues对象。ContentValues类似Hashmap,键/值存储,存储基本类型以及字符串,键必须是字符串类型,指代数据列名

void execSQL()


SQLiteOpenHelper 抽象类
封装获取SQLite数据的方法,提供了同步等安全性的操作,继承它重写onCreate/onUpgrade即可

例:
ORM
Table TStduent(no,name) -------->class Student(String stuNo,String stuName)

db为SQLiteDataBase数据库对象
增加操作
Student stu = new Student("100","测试1");
ContentValues values = new ContentValues();
values.put("no",stu.getStuNo());
values.put("name",stu.getStuName());

long row = db.insert("TStudent",null,values); //null表示不是空行意思

String sql = "insert into TStudent values(?,?)";
String[] arg

s={stu.getStuNo(),stu.getStuName()};
db.execSQL(sql,args);
---------------------------------------------------
更新操作
Student stu = new Student("100","更改");
ContentValues values = new ContentValues();
values.put("name",stu.getStuName());

//no=?是wheret条件,最后的一个实参代表参数数组
long row = db.update("TStudent",values,"no=?",new String[]{stu.getStuNo()});

String sql = "update TStudent set name=? where no=?";
String[] args={stu.getStuName(),stu.getStuNo()};
db.execSQL(sql,args);
---------------------------------------------------
删除操作
Student stu = new Student("100","更改");
db.delete("TStudent","no=?",new String[]{stu.getStuNo()});

String sql = "delete from TStudent where no=?";
String[] args = new String[]{stu.getStuNo()};
db.execSQL(sql,args);


=======================================================================================
查询操作
Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
//以对象的形式查询结果,SQL语句的拼装由系统完成

Cursor rawQuery(String sql,String[] args);
//手动拼装SQL语句,并给定参数


Cursor数据查询结果,SQLite查询结果是一个类似游标的结构返回的,可以通过方法获取列的数量,但不能获取行的
数量,必须通过moveToXXX方法进行行的移动才能读取数据(初始时游标指针指向结果集以外)

重要的方法
int getColumnCount()
XXX getXXX(int columnIndex); //通过列的序号以对应数据类型获取数据

boolean moveToNext();//移动到下一行
boolean moveToFirst(); //移动到第一行
boolean moveToLast(); // 移动到最后一行




相关文档
最新文档