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(); // 移动到最后一行