Android开发——存储

一、SharedPreferences

保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。

是一个较轻量级的存储数据的方法,适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。

默认存储路径:/data/data/<PackageName>/shared_prefs

注意事项:

1.

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。

2. 

SharedPreferences本身是一 个接口!!,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例

3. 

getSharedPreferences(String name, int mode)

该方法中name表示要操作的xml文件名,第二个参数为设置读写模式,有以下三种选择:

  • Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。
  • Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。
  • Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写。

4. 读取其他应用程序的SharedPreferences

a)首先需要获取其他应用程序的上下文Context 

Context pvCount = createPackageContext("com.tony.app",Context.CONTEXT_IGNORE_SECURITY);这里的com.tony.app就是其他程序的包名

/*
flags  标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。
CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。
CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。
*/

b)获取该上下文环境下的SharedPreferences

SharedPreferences read = pvCount.getSharedPreferences("fristData", Context.MODE_WORLD_READABLE);

1)写操作步骤

//写操作
        //step1 获取SharedPreference.Editor对象
        SharedPreferences.Editor editor = getSharedPreferences("newFile", MODE_PRIVATE).edit();
        //step2 写入键值对数据
        editor.putString("firstData", "哈哈哈哈我是第一个数据");
        //step3 提交
        editor.commit();

2)读操作步骤

//读操作
SharedPreferences read = getSharedPreferences("newFile", MODE_PRIVATE);
//通过 键 获取数值
String val = read.getString("firstData", "");

二、文件存储

Context提供了FileOutputStream和FileInputStream两个文件输出输入流来进行文件的读写

openFileOutput(String name, int mode);为写入数据做准备而打开文件,如果指定的文件存在,则之间打开文件准备写入数据,否则创建一个“name”新文件。

openFileInput(String name);为读入数据做准备而打开文件名为“name”的文件。

int mode参数有以下选择:

MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可   以使用Context.MODE_APPEND

MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

读写文件注意:以字节数组byte[]的形式进行读写!!!!

1)写文件

        //写文件
        try {
            FileOutputStream out = openFileOutput("test", Context.MODE_APPEND);
            String message = "嘿嘿嘿嘿嘿嘿";
            out.write(message.getBytes());//以字节数组的形式写入
            out.flush();//冲洗输入缓存!!
            out.close();//关闭写入流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

2)读文件

        //读文件
        try {
            FileInputStream in = openFileInput("test");
            byte[] bytes = new byte[in.available()];//可取的容量
            in.read(bytes);//以字节数组的形式读取
            String message = new String(bytes);
            Log.d("STag", message);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

三、SQLite

默认存储路径:/data/data/<PackageName>/databases

SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据。

1)创建数据库

需要用到SQLiteOpenHelper类和SQLiteDatabase类

SQLiteOpenHelper:帮助类,用于辅助创建、更新数据库。一般自定义一个继承它的类,重载相关方法

SQLiteDatabase:内包含对数据进行增删改查的方法。注意在使用中,应调用SQLiteOpenHelper类中的getWritableDatabase()和getReadableDatabase()来创建数据库,由SQLiteOpenHelper类来决定何时调用这两个函数

a)自定义SQLiteOpenHelper类:

public class MyDBOpenHelper extends SQLiteOpenHelper {
    //构造函数,参数一:上下文环境  参数二:数据库名  参数三:查询时返回的cursor  参数四:数据库版本
    public MyDBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //创建数据库
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //创建表  语法格式: 列名 数据类型 约束, ..., ...,
        String create = "create table Stu (id INTEGER PRIMARY KEY AUTOINCREMENT, sname TEXT, snum TEXT, sage INTEGER)";
        sqLiteDatabase.execSQL(create);
    }

    //升级数据库
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

SQLite具有以下五种数据类型:

数据类型解释
NULL空值
INTEGER带符号的整型,具体取决有存入数字的范围大小。
REAL浮点数字,存储为8-byte IEEE浮点数
TEXT字符串文本。
BLOB二进制对象。

 b)创建数据库并获取读写权限

//创建数据库
MyDBOpenHelper myDBOpenHelper = new MyDBOpenHelper(this, "Student.db", null, 1);
SQLiteDatabase db = myDBOpenHelper.getWritableDatabase();//创建表,并获取读写权限
/*
getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,此时的数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错!!!。

getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
*/

2)数据操作

a)增

将数据写入ContentValue类中,再调用SQLiteDatabase类的insert函数,将ContentValue插入其中

//把输入的数据,写入到ContentValue实例中
ContentValues contentValues = new ContentValues();//存储一行数据
//调用put函数,存储数据
contentValues.put("sname", name.getText().toString());//将输入的name存储到“sname”列中
contentValues.put("snum", num.getText().toString());
contentValues.put("sage", Integer.parseInt(age.getText().toString()));
//往数据库中插入一条数据
/*
* 1、第一个参数表名;
2、第二个参数是某些为空的列自动赋值null;
3、第三个参数是ContentValue对象。
* */
db.insert("Stu", null, contentValues);
Toast.makeText(MainActivity.this, "提交数据成功!", Toast.LENGTH_SHORT).show();

b)查

调用SQLiteDatabase类的query函数,注意该函数返回的是Cursor类对象,数据均封装在该对象中。

query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit):
方法各参数的含义:

table表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns要查询出来的列名。相当于select语句select关键字后面的部分。
selection查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就 会有异常。
groupBy相当于select语句group by关键字后面的部分
having相当于select语句having关键字后面的部分
orderBy相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

Cursor类:

 获取数据的方法:(注意要先获取该”列名“所在的列序号columnIndex 从0开始编号

(1)以字节数组的形式返回请求列的值:byte[] getBlob(int columnIndex)
(2)以字符串形式返回请求列的值:String getString(int columnIndex)
(3)以整数形式返回请求列的值:int getInt(int columnIndex)
(4)以 long 形式返回请求列的值:long getLong(int columnIndex)
(5)以浮点数形式返回请求列的值:float getFloat(int columnIndex)
(6)以双精度形式返回请求列的值:double getDouble(int columnIndex)
(7)返回给定列值的数据类型:int getType(int columnIndex)
(8)列值是否为空:boolean isNull(int columnIndex)
(9)以短形式返回请求列的值:short getShort(int columnIndex)

c)删

d)改

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值