当前位置:   article > 正文

Android数据存储:SQLite数据库、SharedPreference存储_sqlite与sharedpreferences

sqlite与sharedpreferences

瞬时数据就是那些存储在内存中,有可能会因为程序关闭或其他原因导致被回收而丢失的数据。
数据持久化就是将那些内存中的瞬时数据保存到存储设备中,保证即使 在手机或计算机关机的情况下,这些数据仍然不会丢失。

保存在内存中的数据是处于瞬时状态的,保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态间进行转换。Android系统中主要提供了3中方法:文件存储、SharedPerferences存储以及SQLite数据库存储。

一、文件存储

我们可以借助Device File Explorer 工具查看。在Android Studio的右侧边栏中。也可以ctrl+Shift+A打开搜索功能。这个工具就相当于一个设备文件浏览器。

二、SharedPreference存储

第二种存储用户数据的方式,使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferences的getXxx(name), 就可以根据键获得对应的值!使用起来很方便!

2.1 写入数据

在使用之前先要获取 SharedPreference对象。获取的方法有两种:

  • context类中的getSharedPreferences()
    一个参数用于指定 SharedPreference文件名称,如果不存在将创建一个。默认存放在/data/data/“应用包名”的shared_prefs/目录下;第二个参数用于指定操作模式。
  • Activity 类中的 getPreferences()
    这个方法只接受一个参数就是操作模式,因为生成的文件名就是当前activity的类名。

得到 SharedPreference对象后就可以向 SharedPreference文件中存储数据了,步骤三步走:

  1. 调用 SharedPreference 对象的 edit() 方法获得可修改的 SharedPreference.Editor对象
  2. 向获得的 SharedPreference.Editor对象中添加数据。使用其putString(String key,String value)方法
  3. 使用 SharedPreference.Editor对象中的 commit() 方法将添加的数据提交,确定修改。

范例:

SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", username);
editor.putString("passwd", passwd);
editor.commit();
  • 1
  • 2
  • 3
  • 4
  • 5

2.2 获取数据

SharedPreference文件是使用XML格式对数据进行管理的。
SharedPreference对象中提供了一系列的get方法,用于读取存储的数据,每种get方法都对应了SharedPreference.Editor中的一种put方法。get方法中传入两个参数,第一个是键,第二个是默认值,即在找不到键时返回的默认值。

范例:

Map<String, String> data = new HashMap<String, String>();
SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
data.put("username", sp.getString("username", ""));
data.put("passwd", sp.getString("passwd", ""));
  • 1
  • 2
  • 3
  • 4

先通过getSharedPreferences()方法得到了SharedPreference对象,然后调用相应的get方法。

三、SQLite数据库存储

SQLite是一个开源的嵌入式关系数据库,其可移植性好,易使用,高效,可靠。SQLite嵌入到使用它的应用程序中,他们共用相同的进程空间,而不是两个不同的进程。其支持多表和索引、事务、视图、触发。SQLite是无数据类型的数据库,就是字段不用指定类型,虽然SQLite可以忽略数据类型,但是通常会在Create Table语句中指定数据类型,因为数据类型可以告知这个字段的含义,便于对代码的阅读和理解。常见的数据类型如下:

  • INTEGER 一个有符号的整数类型
  • REAL 浮点类型
  • TEXT 字符类型,采用编码的UTF-8、UTF-16
  • BLOB 大二进制对象类型能够存放任何二进制数据

3.1 SQLite数据库创建

Android 中提供了一个帮助类 android.database.sqlite.SQLiteOpenHelper。来实现对SQLite数据存储。SQLiteOpenHelper是一个抽象类必须实以下两个方法:

  • void onCreate(SQLiteDatabase db)
  • void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)

范例:

public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库sql语句并执行
        String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer)";
        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在范例中的构造方法中,调用了父类的构造方法:

  • SQLiteOpebHelper(Context context,String name,CursorFactory factory,int version)

第一个参数是上下文,第二个参数是数据文件的名字,第三个参数是CursorFactory对象,用来构造查询完成后返回的Cursor的子类对象为空的时候默认使用CursorFactory构造;第四个参数为数据库的版本号,用于更新数据库

在范例中

  • onCreate(SQLiteDatabase db) 方法:主要的作用是创建和初始化数据中的表等数据库对象,
  • db.execSQL(sql.toString)方法:是用于建表和插入数据。
  • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法:作用是更新数据库,但数据库版本发生变化的时候该方法被调用。

3.2 增加数据

插入数据是通过 SQLiteDatabase 的 insert() 方法将数据插入到数据库中,插入 insert() 的方法有两个主要的形式:

  • public long insert(String table , String nullColumnHack , ContentValues values)
  • public long insertorThrow(String table , String nullColumnHack , ContentValues values)

这两个方法返回值都是整数,代表id,这个id是SQLite维护的,发生错情况返回-1。第一个参数是表名;第二个参数是指定一个列名,在SQL标准中不饿能插入全部字段为空的记录,但是又使用户需要插入全部字段为NULL值,然后再去执行SQL语句。一般情况下第三个参数有值的时候本参数传入null;第三个参数指定具体的字段的值,相当于map集合,键值对的形式存储。

范例:

DBOHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
//创建存放数据的ContentValues对象
ContentValues values = new ContentValues();
values.put("username","test");
values.put("password","123456");
values.put("age",20);
//数据库执行插入命令
db.insert("user", null, values);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

首先声明一个实现了SQLiteOpenHelper的抽象类的成员变量实例化,然后通过getWritableDatabase()获取一个可写入的 SQLiteDatabase 对象。将准备好的数据放到 ContentValues 对象中,ContentValues 与 Map类似,通过put(key, values) 方法把数据放入。最后调用 SQLiteDatabase 对象的insert方法存入数据库

3.3 删除数据

删除数据是通过 SQLiteDatabase 的 delete 方法:

  • public int delete(String table,String whereClause,String[] whereArgs)

第一个参数是表名;第二个参数是条件,可以带有占位符号(?);第三个参数是一个字符串数据,它为第二个参数提供数据,实际运行时候替换占位符号。方法返回值是证书,代表id,这个id是SQLite维护的,发生错误返回-1.

范例:

DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
db.delete("user", "username=?", new String[]{"test"});
  • 1
  • 2
  • 3

3.4 修改数据

修改数据是通过 SQLiteDatabase 提供的 updata 方法

  • public int update(String table, ContentValues values, String whereClause, String[] whereArgs)

该方法参数与 insert 和 delete 方法类似

范例:

DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
ContentValues values2 = new ContentValues();
values2.put("username", "admin123");
db.update("user", values2, "username=?", new String[]{"admin"});
  • 1
  • 2
  • 3
  • 4
  • 5

3.5 查询数据

查询数据是通过 SQLiteDatabase 提供的 query 方法,该方法返回游标(Cursor)对象,query方法有三个重载方法:

  • public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy)
  • public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
  • public Cursor query(boolean distinct, String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy,String limit)

范例:

DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
//创建游标对象
Cursor cursor = db.query("user", new String[]{"id","username","age"}, "username=?",
 new String[]{"admin123"}, null, null, null);
//利用游标遍历所有数据对象
while(cursor.moveToNext()){
    String id = cursor.getString(cursor.getColumnIndex("id"));
    String username = cursor.getString(cursor.getColumnIndex("username"));
    int age = cursor.getInt(cursor.getColumnIndex("age"));
    Log.i("Mainactivity","result: id="  + id +" username: " + username +"  age:" + age);
}
// 关闭游标,释放资源
cursor.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

查询结果返回的是一个游标对象,游标对象可以理解为一个二维表格,在游标中字段是通过query方法中的columns参数指定的。游标的相关方法列举如下:

  • isAfterLast()
  • isBeforeFirst()
  • move(int offest)
  • moveToFirst()
  • moveToLast()
  • moveToNext()
  • moveToPrevious
  • moveToPosition(int position)
  • getColumnCount()
  • getColumnIndex(String columnNmae)
  • getCount()
  • getFloat(int columnIndex)
  • getInt(int columnIndex)
  • getLong(int columnIndex)
  • getShort(int columnIndex)
  • getString(int columnIndex)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法创新者/article/detail/60772
推荐阅读
相关标签
  

闽ICP备14008679号