前言
- 如果需要存储用户配置,比如某些选项是允许还是禁止,或者是搜索框的历史记录,可以使用 sharedpreferences,它是一种存储key-value的xml文件,可以实现轻量级数据的永久存储,使用SharedPreferences类读写。
- 如果需要存储少量的、简单的数据,可以使用Json文件。
- 如果需要存储大量的、复杂的数据,比如一个跑步运动App,持续追踪用户的跑步路线,那就需要存储大量的地理位置数据,而SQLite是一个轻量级的开源跨平台库,并具有一套强大的关系型数据库API可供使用,数据在磁盘上单个文件的形式存在。Android为SQLite提供了很多类,可以很方便的完成对数据库的读写操作。以上内容引用自《Android权威编程指南 第34章 P482》
使用
- 添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
SharedPreferences
- 一种轻量级的数据存储方式,
- 常用于储存一些配置信息和一些比较简单的数据
使用
- 获取SharedPreferences对象
- 共有两个参数
- 参数1:第一个是文件名
- 参数2:文件操作模式
SharedPreferences sp=getSharedPreferences("mydata",MODE_PRIVATE);
- 获取SharedPreferences编辑器
SharedPreferences.Editor editor=sp.edit();
- 存放数据
- putString(“key”,“value”)
- 后面是数据类型,如 putBoolean ,用于存放一个 Boolean 类型的数据,参数一共有两个
- key: 一条数据的标识,等取数据的时候还要用到这个
- value: 要存放的具体数值
editor.putString("name","君莫笑");
editor.putInt("age",18);
- 提交修改
- .commit()
会返回一个boolean类型的数据,可以用于判断修改是否执行成功 - .apply()
没有返回值,但效率要比commit高
editor.commit();
editor.apply();
- 获取数据
- getString(“key”,“value”)
- 后面是数据类型,如 getBoolean ,用于取出一个 Boolean 类型的数据,同样也是两个参数
- key: 通过key的值,取出对应的数值
- value: 传入一个同类型的数据,当数据获取失败时,该方法就会返回这个数值,避免了空值问题
sp.getString("name","小李");
sp.getInt("age",12);
- 清空数据
- .clear()
清空文件里的所有数据
editor.clear();
editor.apply();
//editor.commit();
↓
↓
↓
↓
↓
↓ 继续学习
↓
↓
↓
↓
↓
SQLite
- SQLite是一款轻型的数据库
- 它能够支持Windows/Linux/Unix等等主流的操作系统
- 同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等
特点
- 零配置 – 无需安装和管理配置
- 储存在单一磁盘文件中的一个完整的数据库
- 数据库文件可以在不同字节顺序的机器间自由的共享
- 独立: 没有额外依赖
- 简单, 轻松的API
使用
- 写一个类去继承SQLiteOpenHelper
public class MySQLiteOpenHelper extends SQLiteOpenHelper
{
public MySQLiteOpenHelper(Context mContext)
{
super(mContext, "数据库.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase p1)
{
String string="create table if not exists 表 (_id integer primary key autoincrement,name text,age integer)";
p1.execSQL(string);
}
@Override
public void onUpgrade(SQLiteDatabase p1, int p2, int p3)
{
}
}
使用方法
- 在需要使用的类中实例化一个SQLiteOpenHelper对象
SQLiteOpenHelper mSQLiteOpenHelper = new MySQLiteOpenHelper(this);
- 声明一个SQLiteDatabase对象
SQLiteDatabase mSQLiteDatabase;
然后…
1.插入数据
- 插入一条数据
//打开数据库的写入通道
mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
//创建一个ContentValues对象
ContentValues cv=new ContentValues();
//在对应的key中,存放数值
cv.put("name", "君莫笑");
cv.put("age", 18);
//插入数据
mSQLiteDatabase.insert("表", null, cv);
//关闭数据库
mSQLiteDatabase.close();
- 插入多条数据
//打开数据库的写入通道
mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
//创建一个ContentValues对象
ContentValues cv=new ContentValues();
//在对应的key中,存放数值
cv.put("name", "君莫笑");
cv.put("age", 11);
//插入数据
mSQLiteDatabase.insert("表", null, cv);
//清空ContentValues对象的所有数据
cv.clear();
//继续存放数值
cv.put("name", "李白");
cv.put("age", 16);
//继续插入数据
mSQLiteDatabase.insert("表", null, cv);
//关闭数据库
mSQLiteDatabase.close();
- 如果需要插入大批量数据,请开启事务
(未测试)
//手动设置开始事务
//数据插入操作循环
mSQLiteDatabase.beginTransaction();
//设置事务处理成功,不设置会自动回滚不提交
mSQLiteDatabase.setTransactionSuccessful();
//处理完成
mSQLiteDatabase.endTransaction();
2.更新数据
//打开数据库的写入通道
mSQLiteDatabase=mSQLiteOpenHelper.getWritableDatabase();
//创建一个ContentValues对象
ContentValues cv=new ContentValues();
//在对应的key中,存放数值
cv.put("name","妖侠蛮吉");
//更新数据
mSQLiteDatabase.update("表",cv,"_id=?",new String[]{"1"});
//参数1:"表名称"
//参数2:更新后的数据(使用ContentValues类型表示),在对应的key中放上修改后的数值即可
//参数3:where条件,使用占位符"?"表示
//参数4:为where条件的占位符提供具体数值
//关闭数据库
mSQLiteDatabase.close();
3.删除数据
//打开数据库的写入通道
mSQLiteDatabase=mSQLiteOpenHelper.getWritableDatabase();
//删除数据
mSQLiteDatabase.delete("表","_id=?",new String[]{"1"});
//参数1:"表名称"
//参数2:where条件,使用占位符"?"表示
//参数3:为where条件的占位符提供具体数值
//关闭数据库
mSQLiteDatabase.close();
4.查询数据
//重置editText的文字内容
editText.setText("");
//打开数据库的读取通道
mSQLiteDatabase = mSQLiteOpenHelper.getReadableDatabase();
//前面是创建一个新的Cursor(游标)对象
//后面是返回一个Cursor对象,数据库的查询结果(数据集)
Cursor cursor=mSQLiteDatabase.query("表", null, null, null, null, null, null);
//移动到第一行
cursor.moveToFirst();
//开启循环,直到遍历完所有数据
//isAfterLast:是否在最后一项的后面
//!cursor.isAfterLast() 当数据遍历完最后一项时,终止循环
//如果是将isAfterLast换成isLast的话,当数据遍历到最后一项时,就会终止循环,效果:最后一项没有被遍历
while (!cursor.isAfterLast())
{
//getColumnIndex(列名)返回列的索引值(int类型)
/*所以有两种写法
String id=cursor.getString(0);
String name=cursor.getString(1);
String age=cursor.getString(2);
*/
String id=cursor.getString(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
String age=cursor.getString(cursor.getColumnIndex("age"));
//将查询结果显示到editText上
editText.setText(editText.getText().toString() + "id=" + id + " name=" + name + " age=" + age + "\n");
//将Cursor移动到下一行
cursor.moveToNext();
}
//关闭数据库
mSQLiteDatabase.close();
- Cursor(游标)的其他方法
方法 | 解析 |
---|---|
.move(int offset) | 以当前位置为起点进行移动 |
.moveToFirst() | 移动到第一行 |
.moveToLast() | 移动到最后一行 |
.moveToPosition(int position) | 移动到指定行 |
.getString(int columnIndex) | 获取指定列的数值 |
.isFirst | 是否正处于第一项 |
.isBeforeFirst | 是否处于第一项的前面 |
.isLast | 是否正处于最后一项 |
.isAfterLast | 是否处于最后一项的后面 |
.getCount | 获取行数 |
.getColumnCount | 获取列数 |
- 上面的遍历数据库也可以写成这样
for(cursor.moveToFirst();cursor.moveToNext();cursor.isAfterLast())
{
//执行操作
}
下面的参数解析来源于《第一行代码》
- 查询方法参数解析
query(String table,String[] columns, String selection,String[] selectionArgs, String groupBy,String having, String orderBy, String limit)
query()方法参数 | 解析 |
---|---|
table | 指定查询的表名 |
columns | 指定查询的列名 |
selection | 指定where的约束条件 |
selectionArgs | 为where中的占位符 “?” 提供具体的值 |
groupBy | 指定需要group by的列 |
having | 对group by后的结果进一步约束 |
orderBy | 指定查询结果的排序方式 |
limit | 限制返回的行数,如果为null,则表示不限制,返回所有行 |