一、文件存儲
文件存儲是一種較常用的方法,文件存儲是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、網絡存儲:是通過網絡提供的存儲空間來存儲/獲取數據信息。