前言
安卓文件内/外存储路径的获取:
方法 | 作用 |
---|---|
Environment.getDataDirectory() | 获取内部存储的根路径 |
getFilesDir() | 获取某个应用在内部存储中的files路径 * |
getCacheDir() | 获取某个应用在内部存储中的cache路径 |
Environment.getExternalStorageDirectory() | 获取外部存储的根路径 |
getExternalFilesDir() | 获取某个应用在外部存储中的files路径 |
getExternalCacheDir() | 获取某个应用在外部存储中的cache路径 |
以上方法用来获取内/外部存储路径,其中带*
的方法在使用context.openFileInput()
和context.openFileOutput()
时可以直接访问到该文件目录,且方法返回的是FileInputStream
和FileOutputStream
对象。
参考:安卓内/外存储路径
一、SD卡存储
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".sdcardActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn_writer_to_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="往SD卡写数据"/>
<Button
android:id="@+id/btn_reader_from_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取SD卡数据"/>
<TextView
android:id="@+id/tv_show"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center"
android:text="hello"/>
</LinearLayout>
//找到控件
private void initView() {
mBtnWriter = this.findViewById(R.id.btn_writer_to_sdcard);
mBtnReader = this.findViewById(R.id.btn_reader_from_sdcard);
mTvShow = this.findViewById(R.id.tv_show);
}
//设置点击事件监听
private void initLinstener() {
mBtnWriter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeToSDcard(); //实现存储
}
});
mBtnReader.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
readFromSDcard(); //实现数据读取
}
});
}
private void writeToSDcard() {
//获取外部存储根目录 即/storage/emulated/0
File filePath = Environment.getExternalStorageDirectory();
//Log.d(TAG,"dir = " +filePath); 可以打印日志查看路径
File file = new File(filePath,"info.text");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write("我是往SD卡中写入的数据".getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void readFromSDcard() {
FileInputStream fis ;
File filedir = Environment.getExternalStorageDirectory();
File file = new File(filedir,"info.text");
try {
fis = new FileInputStream(file);
BufferedReader bfr = new BufferedReader(new InputStreamReader(fis));
String info = bfr.readLine();
mTvShow.setText(info); //文件中读取数据,然后设置TextView的内容
} catch (Exception e) {
e.printStackTrace();
}
}
二、SharedPreference
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SharedprefsActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn_sharedPrefs_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="存储数据"/>
<Button
android:id="@+id/btn_sharedPrefs_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据读取"/>
<TextView
android:id="@+id/tv_sharedPrefs_show"
android:layout_width="match_parent"
android:layout_height="150dp"
android:text="hello"
android:gravity="center"/>
</LinearLayout>
private void initView() {
mBtnWrite = this.findViewById(R.id.btn_sharedPrefs_write);
mBtnRead = this.findViewById(R.id.btn_sharedPrefs_read);
mTvShow = this.findViewById(R.id.tv_sharedPrefs_show);
}
private void initLinstener() {
mBtnWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPrefswrite();
}
});
mBtnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPrefsread();
}
});
}
private void SharedPrefswrite() {
//this指当前的context
// 路径 /data/data/包名/shared_prefs/info.text
//MODE_PRIVATE 当前存储的数据只属于当前这个应用
mSharedPreferences = this.getSharedPreferences("info.text", MODE_PRIVATE);
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("writed","我是在sharedPrefs中写入的数据");
editor.commit(); //提交
}
private void SharedPrefsread() {
//获取数据,默认hello
String string = mSharedPreferences.getString("writed", "hello");
mTvShow.setText(string);
}
三、SQLite
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SqliteActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn_create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"/>
<Button
android:id="@+id/btn_write_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="存储数据"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_insert"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:text="插入"/>
<Button
android:id="@+id/btn_delete"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:text="删除"/>
<Button
android:id="@+id/btn_update"
android:layout_width="0dp"
android:layout_height="50dp"
android:text="更新"
android:layout_weight="1" />
<Button
android:id="@+id/btn_query"
android:layout_width="0dp"
android:layout_height="50dp"
android:text="查询"
android:layout_weight="1"/>
</LinearLayout>
<TextView
android:id="@+id/tv_database_show"
android:layout_width="match_parent"
android:layout_height="150dp"
android:text="hello"
android:gravity="center"/>
</LinearLayout>
Constans类,存放常量
public class Constants {
public static final String DATABASE_NAME = "myAndroid.db";
public static final int VERSION_CODE = 1;
public static final String TABLE_NAME = "user";
}
Helper类,负责数据库创建
//SQLiteOpenHelper是一个抽象类,要使用它需要继承
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "MyDatabaseHelper";
//参数分别是,传入的上下文,数据库名称,游标工厂,数据库版本号
public MyDatabaseHelper(@Nullable Context context ) {
super(context, Constants.DATABASE_NAME, null, Constants.VERSION_CODE);
}
/**
* 数据库第一次被创建时调用,在这里可以进行表的初始化
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库时的回调
Log.d(TAG,"创建数据库");
String sql = "create table " + Constants.TABLE_NAME+ "(id integer,name varchar,age integer,salary integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//升级数据库时的回调
Log.d(TAG,"升级数据库");
//升级数据库需要更改version号,Constants中的版本号大于当前版本号时才会调用该方法
String sql = "alter table " + Constants.TABLE_NAME + " add phone integer";
db.execSQL(sql);
}
}
DAO类,封装对数据库的操作
public class DAO {
private static final String TAG = "DAO";
private final MyDatabaseHelper mHelper;
public DAO(Context context){
//创建数据库
//DAO类创建Helper对象并传入context
mHelper = new MyDatabaseHelper(context);
}
public void initDB() { //初始化表中的数据
SQLiteDatabase db = mHelper.getWritableDatabase();
String sql = "insert into " + Constants.TABLE_NAME + "(id,name,age,salary) values(?,?,?,?)";
db.execSQL(sql,new Object[]{1,"chen",22,13000});
db.execSQL(sql,new Object[]{3,"wang",23,12000});
db.execSQL(sql,new Object[]{10,"li",28,20000});
db.close();
}
public void insert() {
SQLiteDatabase db = mHelper.getWritableDatabase();
ContentValues value = new ContentValues();
value.put("id",2);
value.put("name","page");
value.put("age",60);
value.put("salary",20);
//使用API来操作数据库
db.insert(Constants.TABLE_NAME,null,value);
db.close();
}
public void delete() {
SQLiteDatabase db = mHelper.getWritableDatabase();
String sql = "delete from " + Constants.TABLE_NAME + " where age = 28";
db.execSQL(sql);
db.close();
}
public void update() {
SQLiteDatabase db = mHelper.getWritableDatabase();
String sql = "update " + Constants.TABLE_NAME + " set salary = 20 where age = 23";
db.execSQL(sql);
db.close();
}
public String[] query() {
SQLiteDatabase db = mHelper.getWritableDatabase();
String sql = "select * from " + Constants.TABLE_NAME;
//cursor游标,指向查询结果的一行
Cursor cursor = db.rawQuery(sql, null);
List<String> list = new ArrayList<>();
while(cursor.moveToNext()) {
//获取该行中的每一个字段
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
int salary = cursor.getInt(3);
list.add(id +" "+ name +" "+ age +" "+ salary);
}
cursor.close();
db.close();
return list.toArray(new String[list.size()]);
}
}
Activity中负责对点击事件的处理
//Activity实现OnClickListener接口,重写onClick方法
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_create_database:
mDao = new DAO(this);
mTvDBshow.setText("创建数据库成功");
break;
case R.id.btn_write_database:
mDao.initDB();
mTvDBshow.setText("初始化数据库成功");
break;
case R.id.btn_insert:
if (mDao != null) {
mDao.insert();
}else {
mTvDBshow.setText("请先创建数据库");
}
break;
case R.id.btn_delete:
if (mDao != null) {
mDao.delete();
}else {
mTvDBshow.setText("请先创建数据库");
}
break;
case R.id.btn_update:
if (mDao != null) {
mDao.update();
}else {
mTvDBshow.setText("请先创建数据库");
}
break;
case R.id.btn_query:
if (mDao != null) {
mTvDBshow.setText(Arrays.toString( mDao.query()));
}else {
mTvDBshow.setText("请先创建数据库");
}
break;
}
}