Android (安卓数据的五种存储方式)
16lz
2021-01-23
一、文件存储
文件存储是一种较常用的方法,文件存储是Android中最基本的一种数据存储方式,与Java中的文件存储类似,都是通过I/O流的形式存储数据
Android中的文件存储分为内部存储和外部存储
- 内部存储:将应用程序中的数据以文件方式存储到设备的内部,当内部存储创建的应用程序被卸载时,其内部存储文件也随之被删除
- 外部存储:是将文件存储到一些外部设备上,例如SD卡或者设备内嵌外部存储的存储卡,属于永久性的存储方式
内部存储示例:
package com.liu.fileio;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import java.io.FileInputStream;import java.io.FileOutputStream;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button but1 = findViewById(R.id.but_1); Button but2 = findViewById(R.id.but_2); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText saveCun = findViewById(R.id.et_save); String fileName = "data.txt"; String content = saveCun.getText().toString(); FileOutputStream fos; try { fos = openFileOutput(fileName, MODE_APPEND); fos.write(content.getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } } }); but2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText readDu = findViewById(R.id.et_read); String content = ""; FileInputStream fis; try { fis = openFileInput("data.txt"); //available()方法可以在读写操作前先得知数据流里有多少个字节可以读取 byte[] buffer = new byte[fis.available()]; fis.read(buffer); content = new String(buffer); fis.close(); } catch (Exception e) { e.printStackTrace(); } String strread = content; readDu.setText(strread); } }); }}
界面:
openFileOutput 是Context的方法,如果你不是Activity就不能直接调用,而且MODE_PRIVATE要改为Context.MODE_PRIVATE。
二、SharedPreferences
是Android提供的用来存储一些简单的配置信息的一种机制。
- SharedPreferences是Android平台上一个轻量级的存储类。
- 用于存储应用程序的配置参数,如用户名、密码等。
- 通过key/value(键值对)的形式将数据保存在XML文件中。
- value值只能是float、int、long、boolean、String、StringSet类型数据。
简单用法:
/** * 获取数据 */ private void read2() { SharedPreferences sp = getSharedPreferences("data2",MODE_PRIVATE); String data = sp.getString("name","不存在");//如果得不到值,则返回后面的不存在 EditText et = findViewById(R.id.et_read2); et.setText(data); } /** * 存入数据 */ private void save2() { SharedPreferences sp = getSharedPreferences("data2",MODE_PRIVATE); //获取编译器 SharedPreferences.Editor editor = sp.edit(); EditText et = findViewById(R.id.et_save2); //存入数据 editor.putString("name",et.getText().toString()); editor.putInt("age",21); //修改提交 editor.apply(); }
注意:
- 获取数据的key值与存入数据的key值数据类型要一致,否则查找不到指定数据。
- 保存SharedPreferences的key值时,使用静态变量保存,以免操作时写错,如private final String key=“itcast”。
3、SQLite:数据库是Android自带的一个轻量级数据库,支持基本SQL语法。
- 支持ACID的关系型数据库管理系统。ACID也就是原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
- SQLite保存数据时,支持Null(零)、Integer(整数)、Real(浮点数字),Text(字符串文本)、Blob(二进制对象) 五种数据类型
-
重点掌握execSQL()和rawQuery()方法。
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
rawQuery()方法用于执行select语句
基本用法:
首先:
package com.liu.fileio;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;public class SqlTest extends SQLiteOpenHelper { private static final String DBName = "MyTestSQL"; //声明一个数据库名 private static final int VERISON = 1; //声明一个数据库版本号 public SqlTest(Context context) { super(context, DBName, null, VERISON); } /** * 对数据库表进行初始化,只会在第一次创建数据库表时执行,并且只执行一次 * @param db */ @Override public void onCreate(SQLiteDatabase db) { //创建表 String sql = "create table demo(name varchar(20), age integer)"; //执行SQl语句 db.execSQL(sql); } /** *这个方法是进行数据版本的更新 * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
之后:
package com.liu.fileio;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class SqlDbTest { public SqlTest st; //获取SQLiterDatabase类的实例 public SQLiteDatabase db;//用这个类来进行增删改查 public SqlDbTest(Context context){ st = new SqlTest(context); db = st.getWritableDatabase(); //获取SQLiterDatabase类的实例 } public void InsetrDataforSQL(User user){ String sql = "insert into demo values(?,?)"; db.execSQL(sql,new Object[]{user.getName(),user.getAge()}); } public User SelectData(){ User user = new User(); Cursor cs = db.rawQuery("select * from demo",null);//cursor:光标 while(cs.moveToNext()){ user.setName(cs.getString(cs.getColumnIndex("name"))); user.setAge(cs.getInt(cs.getColumnIndex("age"))); } return user; } public void CloseDb(){ db.close(); }}
使用:
private void read3() { SqlDbTest sdt = new SqlDbTest(this); User user = sdt.SelectData(); EditText et = findViewById(R.id.et_read3); et.setText(user.getName().toString()); sdt.CloseDb(); } private void save3() { EditText et = findViewById(R.id.et_save3); User user = new User(et.getText().toString(),22); SqlDbTest sdt = new SqlDbTest(this); sdt.InsetrDataforSQL(user); sdt.CloseDb(); }
4、ContentProvider:是Android四大组件之一,可以将自己的数据共享给其他应用程序。
5、网络存储:是通过网络提供的存储空间来存储/获取数据信息。
更多相关文章
- 基于xml类型的压缩数据流的android获取天气的方法
- 最新android studio注意事项打不开等问题6种解决方法
- Android核心分析 --分析方法论探讨之设计意图
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V
- 为android开放类增加自定义成员方法[转]
- Android安卓系统提示应用程序未安装的解决方法
- android 从文件制定位置读取数据
- Android---8---Intent及使用Intent传递数据
- Android 文件缓存方法