Android数据储存(SharedPreferences+SQLite)

前言

  • 如果需要存储用户配置,比如某些选项是允许还是禁止,或者是搜索框的历史记录,可以使用 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,则表示不限制,返回所有行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值