本文出自:http://blog.csdn.net/dt235201314/article/details/73176149

源码下载欢迎Star(updating):https://github.com/JinBoy23520/CoderToDeveloperByTCLer

一丶慨述

本周的学习内容是Android存储,要求:数据库Sqlite相关操作,常用的文件存取方式,以及实用场景学习,主要学习Sqlite,SD卡文件操作,SharedPreference

二丶效果演示:

      

     

三丶功能介绍及主要内容

1.图一完成创建文件存储在手机内存中并读取删除,文件操作相关知识;

2.图二完成创建文件存储在手机SD卡中并读取删除,文件操作相关知识;

3.图三完成Sharedpreference存储用户偏好数据,读取删除数据等操作。可通过不同APP读取,暂不讲加密

4.图四完成SQLite完成玩家信息增删改查

参考博客:

玩家信息管理(SQLite+Fragment加强)

以及大神“小猪”博客:http://blog.csdn.net/coder_pig

四丶代码讲解

1.文件存储

主要方法:

Demo1:

FileHelper.Java

/**
* <pre>
* author : JinBiao
* CSDN : http://my.csdn.net/DT235201314
* time : 2017/06/11
* desc : 文件协助类
* 1.文件操作模式:
* 1.Context.MODE_PRIVATE:私有操作模式,默认模式,代表该文件是私有数据,只能被应用本身访问,
* 在该模式下,写入的内容会覆盖源文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND
2.Context.MODE_APPEND:追加操作模式:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
3.Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
4.Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("1234.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
另外,文件默认放在/data/data//files目录下
对于文件的获取,Android中提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data//cache目录
getFilesDir()方法用于获取/data/data//files目录
* version: 1.0
* </pre>
*/
public class FileHelper { private Context mContext; public FileHelper() {
} public FileHelper(Context mContext) {
super();
this.mContext = mContext;
} /**
* 这里定义的是一个文件保存的方法,写入到文件中,所以是输出流
**/
public void save(String filename, String filecontent) throws Exception {
//这里我们使用私有模式,创建出来的文件只能被本应用访问,还会覆盖原文件哦
FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
output.write(filecontent.getBytes()); //将String字符串以字节流的形式写入到输出流中
output.close(); //关闭输出流
} /**
* 这里定义的是文件读取的方法
*/
public String read(String filename) throws IOException {
//打开文件输入流
FileInputStream input = mContext.openFileInput(filename);
byte[] temp = new byte[1024];
StringBuilder sb = new StringBuilder("");
int len = 0;
//读取文件内容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}
//关闭输入流
input.close();
return sb.toString();
}
}

点击事件操作

   @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnclean:
// deleteFile(editname.getText().toString());
editdetail.setText("");
editname.setText("");
break;
case R.id.btnsave:
FileHelper fHelper = new FileHelper(mContext);
String filename = editname.getText().toString();
String filedetail = editdetail.getText().toString();
try {
fHelper.save(filename, filedetail);
Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btnread:
String detail = "";
FileHelper fHelper2 = new FileHelper(getApplicationContext());
try {
String fname = editname.getText().toString();
detail = fHelper2.read(fname);
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
break;
}
}

Demo2

读取流程图:

SDFileHelper.Java

/**
* <pre>
* author : JinBiao
* CSDN : http://my.csdn.net/DT235201314
* time : 2017/06/12
* desc : SD卡文件操作协助类
* version: 1.0
* </pre>
*/
public class SDFileHelper {
private Context context; public SDFileHelper() {
} public SDFileHelper(Context context) {
super();
this.context = context;
} /**
* 往SD卡写入文件的方法
* @param filename
* @param filecontent
* @throws Exception
*/
public void savaFileToSD(String filename, String filecontent) throws Exception {
//如果手机已插入sd卡,且app具有读写sd卡的权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
//这里就不要用openFileOutput了,那个是往手机内存中写数据的
FileOutputStream output = new FileOutputStream(filename);
output.write(filecontent.getBytes());
//将String字符串以字节流的形式写入到输出流中
output.close();
//关闭输出流
} else Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
} /**
* 读取SD卡中文件的方法
* @param filename
* @return
* @throws IOException
*/
public String readFromSD(String filename) throws IOException {
StringBuilder sb = new StringBuilder("");
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
//打开文件输入流
FileInputStream input = new FileInputStream(filename);
byte[] temp = new byte[1024];
int len = 0;
//读取文件内容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}
//关闭输入流
input.close();
}
return sb.toString();
}

点击事件操作:

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnclean:
editdetail.setText("");
editname.setText("");
break;
case R.id.btnsave:
String filename = editname.getText().toString();
String filedetail = editdetail.getText().toString();
SDFileHelper sdHelper = new SDFileHelper(mContext);
try {
sdHelper.savaFileToSD(filename, filedetail);
Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btnread:
String detail = "";
SDFileHelper sdHelper2 = new SDFileHelper(mContext);
try {
String filename2 = editname.getText().toString();
detail = sdHelper2.readFromSD(filename2);
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
break;
}
}

读写权限:

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Demo3

SharePreference

使用流程图:

SharedPreference是以xml map键值对形式保存文件

SharedHelper.java

/**
* <pre>
* author : JinBiao
* CSDN : http://my.csdn.net/DT235201314
* time : 2017/06/12
* desc : SharedPreferences数据存储协助类
* map键值对形式保存文件
* version: 1.0
* </pre>
*/
public class SharedHelper {
private Context mContext; public SharedHelper() {
} public SharedHelper(Context mContext) {
this.mContext = mContext;
} /**
* 定义一个保存数据的方法
* @param username
* @param passwd
*/
public void save(String username, String passwd) {
SharedPreferences sp = mContext.getSharedPreferences("my_sp", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", username);
editor.putString("passwd", passwd);
editor.commit();
Toast.makeText(mContext, "信息已写入SharedPreference中", Toast.LENGTH_SHORT).show();
} /**
* 定义一个读取SP文件的方法
* @return
*/
public Map<String, String> read() {
Map<String, String> data = new HashMap<String, String>();
SharedPreferences sp = mContext.getSharedPreferences("my_sp", Context.MODE_PRIVATE);
data.put("username", sp.getString("username", ""));
data.put("passwd", sp.getString("passwd", ""));
return data;
}
}

SharedPreferenceActivity:

public class SharedPreferenceActivity extends Activity {
private EditText editname;
private EditText editpasswd;
private Button btnlogin,btnshow,button_clear;
private String strname;
private String strpasswd;
private SharedHelper sh;
private Context mContext;
private SharedPreferences sp; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shared_preference_activity);
mContext = getApplicationContext();
sh = new SharedHelper(mContext);
intViews();
} private void intViews() {
editname = (EditText)findViewById(R.id.editname);
editpasswd = (EditText)findViewById(R.id.editpasswd);
button_clear = (Button)findViewById(R.id.button_clear);
btnshow = (Button)findViewById(R.id.buttonshow);
btnlogin = (Button)findViewById(R.id.btnlogin);
btnlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
strname = editname.getText().toString();
strpasswd = editpasswd.getText().toString();
sh.save(strname,strpasswd);
}
}); btnshow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获得第一个应用的包名,从而获得对应的Context,需要对异常进行捕获
try {
mContext = createPackageContext("com.example.jinboy.codertodeveloperbytcler.java_demo.appdemo.ui.androiddemo"
, Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
//根据Context取得对应的SharedPreferences
sp = mContext.getSharedPreferences("my_sp", Context.MODE_WORLD_READABLE);
String name = sp.getString("username", "");
String passwd = sp.getString("passwd", "");
Toast.makeText(getApplicationContext(), "Demo1的SharedPreference存的\n用户名为:" +
name + "\n密码为:" + passwd, Toast.LENGTH_SHORT).show();
}
}); button_clear.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
SPUtils.clear(mContext);
Toast.makeText(getApplicationContext(), "已删除保存信息" , Toast.LENGTH_SHORT).show();
}
});
} @Override
protected void onStart() {
super.onStart();
Map<String,String> data = sh.read();
editname.setText(data.get("username"));
editpasswd.setText(data.get("passwd"));
}
}

SharedPreference工具类

/**
* <pre>
* author : JinBiao
* CSDN : http://my.csdn.net/DT235201314
* time : 2017/06/12
* desc : SharedPreference工具类
* version: 1.0
* </pre>
*/
public class SPUtils { /**
* 保存在手机里的SP文件名
*/
public static final String FILE_NAME = "my_sp"; /**
* 保存数据
*/
public static void put(Context context, String key, Object obj) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (obj instanceof Boolean) {
editor.putBoolean(key, (Boolean) obj);
} else if (obj instanceof Float) {
editor.putFloat(key, (Float) obj);
} else if (obj instanceof Integer) {
editor.putInt(key, (Integer) obj);
} else if (obj instanceof Long) {
editor.putLong(key, (Long) obj);
} else {
editor.putString(key, (String) obj);
}
editor.commit();
} /**
* 获取指定数据
*/
public static Object get(Context context, String key, Object defaultObj) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
if (defaultObj instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObj);
} else if (defaultObj instanceof Float) {
return sp.getFloat(key, (Float) defaultObj);
} else if (defaultObj instanceof Integer) {
return sp.getInt(key, (Integer) defaultObj);
} else if (defaultObj instanceof Long) {
return sp.getLong(key, (Long) defaultObj);
} else if (defaultObj instanceof String) {
return sp.getString(key, (String) defaultObj);
}
return null;
} /**
* 删除指定数据
*/
public static void remove(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.commit();
} /**
* 返回所有键值对
*/
public static Map<String, ?> getAll(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
Map<String, ?> map = sp.getAll();
return map;
} /**
* 删除所有数据
*/
public static void clear(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.commit();
} /**
* 检查key对应的数据是否存在
*/
public static boolean contains(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
return sp.contains(key);
}
}

demo4:

代码详解参考:

扣丁学堂——SQLite

玩家信息管理(SQLite+Fragment加强)

Android基础入门教程——6.3.1 数据存储与访问之——初见SQLite数据库

ContentProvider目前不做详解文章代码参考:

扣丁学堂——ContentProvide

Android基础入门教程——4.4.1 ContentProvider初探

Android基础入门教程——4.4.2 ContentProvider再探——Ducument Provider

Android深入四大组件(五)Content Provider的启动过程

五丶文件存储运用场景:

1.文件操作不能用于其他应用,一般用于图片文件的保存;

2.SharedPreference一般用于用户信息储存,能与其他应用共享数据,一般结合加密使用,如实现免登陆等操作;

3.SQLite轻量级数据库,数据可共享,一般用于结构化数据存储,例如前面文章提到的日记本开发,结构化数据又提供增删改查功能;

4.ContentProvider以提供公用url使数据数据在不同app中共享,例如视频音频图片通讯录等

Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)的更多相关文章

  1. 【Android】14.0 第14章 内部存储与外部SD卡存储—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 Android使用的文件系统是基于Linux的文件系统,在Android应用程序中,开发人员既可以建立和访问程序自 ...

  2. Android SD卡存储

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SDcard_store.html 一 概念 SD卡存储空间比较大,当需要存取较大的 ...

  3. Android 4.0以后正确的获取外部sd卡存储目录

    刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...

  4. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  5. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  6. android打开存储卡(TF卡\SD卡)中的sqlite文件

    android的SDK直接支持sqlite3的API.   打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...

  7. Android——数据存储:手机外部存储 SD卡存储

    xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...

  8. Android——FileOutputStream与openFileOutput()的区别分析【第一个用于文件存储,第二个用于SD卡存储】【转】

    本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...

  9. Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

    假设使用默认的系统管理,默认放在包以下.比較省心.并且在卸载app后不会造成数据残留.可是这样也有一个问题.比方我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了... ...

随机推荐

  1. loj2275 「JXOI2017」颜色

    枚举右端点,然后看左端点合法情况. 先预处理每个颜色 \(i\) 的最大出现位置 \(max_i\) 和最小出现位置 \(min_i\).对于枚举右端点在一个位置 \(i\),凡是 \(max_k & ...

  2. Python面试题(练习一)

    1.Python的可变类型和不可变类型? 可变类型:list.dict(列表和字典) 不可变类型:数字.字符串.元组 2.求结果: v = dict.fromkeys(['k1','k2'],[]) ...

  3. cinema 4d 包括宝典 --- 改线 循环边 建模布线原则

    cinema 4d 一.视图控制与物体控制 1.摇移      alt+鼠标左键   转圈看物体  改变角度 2.平移  alt +鼠标中键      不改变角度  移动 3.推拉  alt+鼠标右键 ...

  4. /mnt/sdcard 是什么东西

    关于/mnt/sdcard和sdcard的区别,可以这样理解:其实,安卓系统是从Linux而衍生出来的,而mnt是unix/Linux传统系统下挂载外部设备的专用目录,Linux默认挂载外部设备都会挂 ...

  5. 【转】[重构]Primitive Obsession

    http://blog.csdn.net/wxr0323/article/details/7913950 Primitive Obsession(基本类型偏执) 偏执这个词实在是有点难懂.百度百科传送 ...

  6. 【bzoj3439】Kpm的MC密码 可持久化Trie树

    题目描述 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了. ...

  7. Code Jam 2017 Round 1A Problem B. Ratatouille

    传送门 分析 首先把包(package)的克数 $Q_{ij}$ 转化成区间 $[\lceil Q_{ij}/(1.1 r_i )\rceil, \lfloor Q_{ij}/(0.9 r_i)\rf ...

  8. 【前端学习笔记】2015-09-02 附~~~~~ajax简单请求和获得响应结果

    首先得创建一个请求XMLHttpRequest对象,var  xmlhttp=window.XMLHttpRequest?new XMLHttpRequest() : new ActiveXObjec ...

  9. 优化join语句

    Mysql4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 ...

  10. linux 程序自动运行总结

    1.开机启动时自动运行程序Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc ...