使用SharedPreferences存储数据
1.适用范围:保存少量的数据,解锁口令密码等。
2.获取方法:
(1)调用Context对象的getSharedPreferences()方法,可被同一应用程序下的其他组件共享
(2)调用Activity对象的getPreferences()方法,只能在该Activity中使用
3.操作模式:
(1)Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
(2)Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
(3)Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
(4)Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
4.例子:
将数据保存至SharedPreferences:
SharedPreferencespreferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Editoreditor=preferences.edit();
Stringname="xixi";
Stringage="22";
editor.putString("name",name);
editor.putString("age",age);
editor.commit();
从SharedPreferences获取数据:
SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Stringname=preferences.getString("name", "defaultname");
Stringage=preferences.getString("age", "0");
使用文件存储数据
1. 适用范围:常用于存储大数量的数据
2. 使用方法:
(1) 存在本机
context.openFileOutput("filename",mode);写入文件
第一个参数:
文件的名称,不能包含路径分隔符“/”,如果文件不存在,Android会自动创建
创建的文件默认保存在/data/data/<package name>/files目录下
第二个参数:
Context.MODE_PRIVATE //文件只能被本应用使用,新建模式
Context.MODE_APPEND //追加模式
Context.MODE_WORLD_READABLE //可以被其他应用读取
Context.MODE_WORLD_WRITEABLE //可以被其他应用写入
context.openFileInput("filename");读取文件
例子:
public String read() { //读文件
try {
FileInputStream inStream = this.openFileInput("message.txt");
byte[] buffer = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder();
while ((hasRead = inStream.read(buffer)) != -1) {
sb.append(new String(buffer, 0, hasRead));
}
inStream.close();
return sb.toString();
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void write(String msg){ //写文件
// 步骤1:获取输入值
if(msg == null) return;
try {
// 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式
FileOutputStream fos =openFileOutput("message.txt",MODE_APPEND);
// 步骤3:将获取过来的值放入文件
fos.write(msg.getBytes());
// 步骤4:关闭数据流
fos.close();
}catch (Exception e) {
e.printStackTrace();
}
}
(2) 存在SD卡
a、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
b、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录
c、使用IO流操作SD卡上的文件
注意,需要配置权限
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
例子:
//文件写操作函数
private void write(String content) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {// 如果sdcard存在
File file = new File(Environment.getExternalStorageDirectory()
.toString()
+ File.separator
+ DIR
+ File.separator
+ FILENAME); // 定义File类对象
if (!file.getParentFile().exists()) { // 父文件夹不存在
file.getParentFile().mkdirs();// 创建文件夹
}
PrintStream out = null; // 打印流对象用于输出
try {
out = new PrintStream(newFileOutputStream(file, true)); // 追加文件
out.println(content);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close(); // 关闭打印流
}
}
} else { // SDCard不存在,使用Toast提示用户
Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show();
}
}
// 文件读操作函数
private String read() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {// 如果sdcard存在
File file = new File(Environment.getExternalStorageDirectory()
.toString()
+ File.separator
+ DIR
+ File.separator
+ FILENAME); // 定义File类对象
if (!file.getParentFile().exists()) { // 父文件夹不存在
file.getParentFile().mkdirs();// 创建文件夹
}
Scanner scan = null; // 扫描输入
StringBuilder sb = new StringBuilder();
try {
scan = new Scanner(newFileInputStream(file)); // 实例化Scanner
while (scan.hasNext()) { // 循环读取
sb.append(scan.next() +"\n"); // 设置文本
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (scan != null) {
scan.close(); // 关闭打印流
}
}
} else { // SDCard不存在,使用Toast提示用户
Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show();
}
return null;
}
SQLite存储数据
1. 特点:
轻量级嵌入式数据库引擎,它支持SQL 语言,并且只利用很少的内存就有很好的性能。我们可以使用SQLite来存储我们大量的数据
2. 使用:
SQLite支持SQL语言,所以不管是增删改查都可以用SQL语句完成,即db.execSQL(sql语句),我们还可以使用他们各自的方法:
(1) 增
(long)insert(Stringtable,String nullColumnHack,ContentValues values)
例子:
//实例化一个ContentValues用来装载待插入的数据
ContentValuescv = new
ContentValues();
cv.put("username","JackJohnson");//添加用户名
cv.put("password","iLovePopMusic");//添加密码
db.insert("user",null,cv);//执行插入操作
(2) 删
(int)delete(Stringtable,String whereClause,String[] whereArgs)
例子:
StringwhereClause = "username=?";//
删除的条件
String[]whereArgs = {"Jack Johnson"};//
删除的条件参数
db.delete("user",whereClause,whereArgs);//
执行删除
(3) 改
(int)update(String table, ContentValues values, StringwhereClause, String[] whereArgs)
例子:
ContentValuescv = new ContentValues();//
实例化ContentValues
cv.put("password","iHatePopMusic");//
添加要更改的字段及内容
StringwhereClause = "username=?";//
修改条件
String[]whereArgs = {"Jack Johnson"};//
修改条件的参数
db.update("user",cv,whereClause,whereArgs);//
执行修改
(4) 查
(Cursor) query(String table, String[] columns, Stringselection, String[] selectionArgs, String groupBy, String having, StringorderBy, String limit)
或
(Cursor) rawQuery(String sql, String[] selectionArgs)
例子:
Cursorc = db.query("user",null,null,null,null,null,null);
//
查询并获得游标
if(c.moveToFirst()){//
判断游标是否为空
for(int i=0;i<c.getCount();i++){
c.move(i);//
移动到指定记录
Stringusername = c.getString(c.getColumnIndex("username");
Stringpassword = c.getString(c.getColumnIndex("password"));
}
}
通过rawQuery实现的带参数查询
Cursor c =db.rawQuery("select * from user whereusername=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
Stringpassword = c.getString(c.getColumnIndex("password"));
}
使用ContentProvider存储数据
1. 特点:
ContentProvider为存储和获取数据提供了统一的接口。使用ContentProvider可以在不同的应用程序之间共享数据。
2. 使用
(1) 定义一个COTENT_URI常量
一个查询URI是由"scheme"、"authority"、"path"组成,还有一个可选择的"id"部分,带有id的URI对应了表格中的某一行。"scheme"一般指定为"content";为了各个Provider之间不产生冲突,"authority"推荐使用应用程序的包名,例如例子中使用的是"com.ns.note";"path"设置成表格名称即可。
关于URI和UriMatcher的详解可参考此篇文章:
http://blog.csdn.net/feng88724/article/details/6331396
(2)定义一个类,继承ContentProvider
(3)实现query(),delete(),update(),insert(),onCreate(),getType()方法
(4)在AndroidMainfest.xml中申明
<provider
android:name="com.example.cptest.FirstContentProvider"
android:authorities="com.example.cptest.FirstContentProvider"
/>
3. 例子:较长,不在这里列出,详情可见下面博客
https://liuzhichao.com/p/562.html
网络存储数据
不做赘述,注意添加权限
<uses-permission android:name="android.permission.INTERNET"/>