Android有五种数据存储方式:文件存储、SharedPreferences、SQLite数据库、ContentProvider、网络存储。
文件存储: 通过I/O流读写文件,跟Java是一样的,一般用来存储一些较大的数据,如文本、图片、音频、视频等。
SharePreferences: Android中用来存储一些配置信息的方式,XML格式。
SQLite数据库: Android中一种轻量级的数据库,支持SQL语法。
ContentProvider: Android四大组件之一,可实现应用程序之间的数据交换,实现数据共享。
网络存储: 通过将数据存储到服务器,从而实现数据的存储。
SQLite是一种轻量级的数据库,支持SQL语法,适合存储大量数据,并对数据进行管理和维护。SQLite是目标是嵌入式的,占用资源低,没有服务进程,它通过文件保存数据,支持null(无)、integer(整型)、real(浮点型)、text(字符串)、blob(二进制)五种数据类型,在接收varchar、char等类型时会自动转化为上述五种类型之一。
要创建SQLite,首先要创建一个类继承于SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
//构造方法,四个参数分别为对应的上下文、数据库名称、游标工厂、数据库版本
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 数据库创建时调用
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库版本号增加时调用
}
}
表的建立和删除:
//建表
private void createTable(SQLiteDatabase db){
//创建表SQL语句
String s="create table Student(sno integer primary key,sname text)";
//执行SQL语句
db.execSQL(s);
}
//删表
private void dropTablle(SQLiteDatabase db){
//删除表的SQL语句
String sql ="DROP TABLE Student";
//执行SQL
db.execSQL(sql);
}
表内数据的增、删、查、改:
//增
public void insert1(String sno, String sname){
SQLiteDatabase db = mh.getWritableDatabase();//获得可读写的SQLiteDatabase对象
ContentValues cv = new ContentValues();//创建ContentValues对象
cv.put("sno", sno);
cv.put("sname", sname);
//参数分别为数据表名称、缺省值(若插入值为空,则插入该值)、ContentValues对象
long id = db.insert("Student", null, cv);
db.close();//关闭数据库
}
private void insert2(String sno, String sname){
SQLiteDatabase db = mh.getWritableDatabase();
//插入数据SQL语句
String s="insert into Student(sno,sname) values("+sno+", "+sname+")";
//执行SQL语句
db.execSQL(s);
db.close();//关闭数据库
}
//删
public void delete1(int sno){
SQLiteDatabase db = mh.getWritableDatabase();
//条件
String where = "id=?";
//条件参数
String[] where2 = {String.valueOf(sno)};
db.delete("Student",where,where2);
db.close();//关闭数据库
}
private void delete2(int sno) {
SQLiteDatabase db = mh.getWritableDatabase();
//删除SQL语句
String sql = "delete from Student where sno = "+sno;
//执行SQL语句
db.execSQL(sql);
}
//查
private String query1(int sno) {
SQLiteDatabase db = mh.getWritableDatabase();
//参数分别为数据表名称、查询的列名、查询条件、条件参数、分组方式、having条件、定义组的过滤器、排序方式
Cursor cursor = db.query("Student", null, null, null, null, null, null);
String sname = null;
if(cursor.moveToFirst()){//判断游标是否为空
cursor.move(sno);
//获得sname
sname = cursor.getString(1);
}
cursor.close();
db.close();
return sname;
}
private String query2(int sno) {
SQLiteDatabase db = mh.getWritableDatabase();
String where = "name=?";
String[] where2 = new String[]{String.valueOf(sno)};
Cursor cursor = db.rawQuery("select * from person where "+where, where2);
String sname = cursor.getString(1);
cursor.close();
db.close();
return sname;
}
//改
private void update1(int sno, String sname) {
SQLiteDatabase db = mh.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("sname", sname);
String[] s = new String[]{String.valueOf(sno)};
//参数分别为数据表名称、ContentValues对象、修改条件、条件参数
db.update("Student", cv, "sno=?", s);
db.close();
}
private void update2(int sno, String sname) {
SQLiteDatabase db = mh.getWritableDatabase();
String[] s = new String[]{sname, String.valueOf(sno)};
db.execSQL("update Student set sname = ? where sno = ?", s);
db.close();
}
游标的使用:
isFirst()
判断是不是第一条记录
isLast()
判断是不是最后一条记录
move(int offset)
移动到指定记录
moveToFirst()
移动到第一条记录
moveToLast()
移动到最后一条记录
moveToNext()
移动到下一条记录
moveToPosition(int positive)
移动到一个绝对位置
moveToPrevious()
移动到上一条记录
getCount()
返回行数
getColumnCount()
返回列的总数
getColumnIndex(String columnName)
返回指定列名,不存在的话返回-1
getColumnName(int columnIndex)
返回指定索引的列名
getColumnNames()
返回一个字符串数组的列名
close()
关闭游标
SQLite的事务是对数据库操作的一连串执行,可以由很多数据库操作组成,形成工作序列,事务的特点就是,当执行过程中发生错误导致无法继续执行,那么在事务中的一连串操作都无法生效,无论是执行过的还是未执行的。
// 获得可读写的对象
SQLiteDatabase db = mh.getWritableDatabase();
//开启事务
db.beginTransaction();
try{
db.execSQL("update Student set sname = abc where sno = ?", new String[]{String.valueOf(1)});
db.execSQL("update Student set sname = def where sno = ?", new String[]{String.valueOf(1)});
} catch (SQLException e) {
}finally{
//关闭事务
db.endTransaction();
//关闭数据库
db.close();
}