Android数据持久化

本文详细介绍了Android中三种数据持久化方法:SharedPreferences用于存储键值对,文件存储涉及openFileOutput和openFileInput操作,SQLite数据库通过SQLiteOpenHelper进行数据管理。讨论了各自的操作模式、使用场景及数据库文件的查看方式。

1.SharedPreferences存储(键值对,简单的数据)

路径:/data/data/包名/shared_prefs/filename

两种方法获取该类对象

Context.getSharedPreferences(抽象方法在ContextWrapper子类中实现)(可以指定文件名,模式)

PreferenceManager.getDefaultSharedPreferences(文件名默认为包名,模式默认MODE_PRIVATE)

(本质还是调用Context的getSharedPreferences方法)

SharedPreferences sharedPreferences=getSharedPreferences("testSP",MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.apply();

四种模式:

后两种模式因为其危险性在API17版本的时候已经过时弃用

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.

SharedPreferences.Editor.apply()异步写入数据,无返回值,效率高,可靠性低

SharedPreferences.Editor.commit同步写入数据,有返回值,效率低,可靠性高(返回值为boolean型,是否写入)

2.文件存储:输出到文件openFileOutput(name,type),从文件读取openFileInput(name)

路径:/data/data/包名/files/filename

就是用Context的这两个方法获得流对象,再用Java各种流进行操作

//输出            
            FileOutputStream outputStream=openFileOutput("fileTest",MODE_PRIVATE);
            BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("Data Test");
            bufferedWriter.close();
//读取
            FileInputStream inputStream=openFileInput("fileTest");
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
            char[] b=new char[50];
            int len=bufferedReader.read(b);
            System.out.println(new String(b,0,len));
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.

3.SQLite轻量级数据库,用SQLiteOpenHelper类操作,或者开源框架Litepal操作

路径:/data/data/包名/databases/filename

使用Android提供的方法SQLiteOpenHelper操作

        SQLiteOpenHelper sqLiteOpenHelper=new SQLiteOpenHelper(MainActivity.this,"testsqlite",null,1) {
            @Override
            public void onCreate(SQLiteDatabase db) {
                db.execSQL("create table Book (id integer primary key autoincrement,author text)");
            }

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

            }
        };
        SQLiteDatabase sqLiteDatabase=sqLiteOpenHelper.getWritableDatabase();

1.继承SQLiteOpenHelper覆写onCreate()和onUpgrade()方法

onCreate在建库时调用,onUpgrade在更新时调用

(这里比较懒,直接用匿名内部类的方法构建)

2.获取SQLiteOpenHelper对象,构造方法四个参数,Context,数据库名,查询返回的自定义Cursor(一般填null),版本号

3.调用getReadableDatabase()和getWritableDatabase()

4.之后可以用SQLiteDatabase对象进行增删改查

 

getReadableDatabase()和getWritableDatabase()的作用和区别

  • 调用会返回一个可以读写数据库的对象
  • 在第一次调用时会调用onCreate的方法
  • 当数据库存在时会调用onOpen方法
  • 结束时调用onClose方法

两者都是读写模式,前者在磁盘满的时候会变成只读,后者在磁盘满的时候会报错

 

生成的.db文件查看用adb(Android Debug Bridge)工具查看

也可以用数据库可视化工具查看例如,SQLiteStudio https://sqlitestudio.pl/index.rvt

 

 

________________________________分割线________________________________

真机调试查看db文件(使用SQLiteStudio可视化工具)

https://blog.youkuaiyun.com/yh18668197127/article/details/86573335

SQLite还可以用开源框架Litepal进行操作,请看我的另一篇博客

https://blog.youkuaiyun.com/yh18668197127/article/details/85065540

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值