一、文件存储
文件存储是一种较常用的方法,文件存储是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、网络存储:是通过网络提供的存储空间来存储/获取数据信息。