偏好
- Android文件存储--采用SharedPreferences保存用户偏好设置参数和读取设置参数,在下次登录时读取.SharedPreferences保存的数据主要类似于配置信息格式的数据,因此它保存数据的形式为key-value对.
一个SharedPreferences中存储的值会自动持久化,并且将会在用户会话中存在。当用户卸载程序时,将会删掉该值。
PreferencesService.java
package com.wwj.service;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class PreferencesService {
private Context context;
public PreferencesService(Context context) {
this.context = context;
}
/**
* 保存参数
* @param name 姓名
* @param age 年龄
* @param sex 性别
*/
public void save(String name, Integer age, Integer sex) {
//获得SharedPreferences对象
SharedPreferences preferences = context.getSharedPreferences("wwj", Context.MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("name", name);
editor.putInt("age", age);
editor.putInt("sex", sex);
editor.commit();
}
/**
* 获取各项参数
* @return
*/
public Map<String, String> getPerferences() {
Map<String, String> params = new HashMap<String, String>();
SharedPreferences preferences = context.getSharedPreferences("wwj", Context.MODE_PRIVATE);
params.put("name", preferences.getString("name", ""));
params.put("age", String.valueOf(preferences.getInt("age", 0)));
params.put("sex", String.valueOf(preferences.getInt("sex", 0)));
return params;
}
}
如果有root权限的手机可以下载个RE文件管理,我们可以再/data/data/的路径找到很多应用程序的内置文件夹,我们可以在这些文件夹中看到一个shared_prefs文件夹.
*Preference API
使用Android Preference API来创建一个用户界面
主要类android.preference.Preference子类包括:
CheckBoxPreference
EditTextPreference
ListPreference
DialogPreference
操作文件
Android 童工了两种存储区域:内部的和外部的。内部存储对应用程序来说是私有的,用户和其他程序不能访问它。
外部存储中所存储的文件将会和其他应用程序分享,其他程序可以访问外部存储。例如:内建的camera应用程序将数字图像文件存储在外部存储中,以便用户能够很容易将其复制到计算机中。
内部存储
所有的应用程序都能够从内部存储中存储读取或者向内部存储中写入。内部存储的位置是/data/data/[app package],因此,如果应用程序是com.example.myapp,这个应用程序的内部目录是/data/data/com.example.myapp。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
外部存储
外部存储有两种文件可以写入:私有文件和公有文件。私有文件是应用程序有的,当应用程序卸载的时候,将会删除这些文件。共有文件要和其他应用程序共享,用户可以访问它。
外部存储也是可以删除的。因此,存储在内部存储中的文件和存储在外部存储中的公有文件之间有一点区别。内部存储中的文件是安全的,不能被用户和其他程序访问。外部存储中的公有文件并不具备相同的安全等级,因此用户能够删除该存储,并且使用某种工具来访问该文件。
由于外部存储能够删除,当你试图读取或者向其写入的时候,应该先测试外部存储是否可用党外部存储不可用的时候,试图访问它导致应用程序崩溃。
1.公共文件Public files:文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是由意义的,当应用被卸载之后,其卸载前创建的文件仍然保留。比如camera应用,生成的照片大家都能访问,而且camera不在了,照片仍然在。
2.私有文件Private files:其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除。类似于内部存储。
在使用外部存储之前,你必须要先检查外部存储的当前状态,以判断是否可用。
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} elseif(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else{
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
操作数据库
android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用C语言构建的.
数据库
-
1 数据库的基本结构——表格
表格是数据库中储存资料的基本架构。表格被分为栏位 (column) 及列位 (row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。每一个表格拥有一个独一无二的名字(Table Name)以便能够让用户定位到它上面。
-
2 关于数据类型
和其他的数据库不同的是,sqlite是无类型的。也就是当你创建一个表格时,无需对每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite会自动找到存入的数据的类型。 SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如VARCHAR、NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。
SQLiteDatabase
这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
(1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory则是一个产生Cursor对象的工厂类(Cursor接口将在后面介绍到)。
(2)public long insert (String table, String nullColumnHack, ContentValues values)
看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。
(3)public int delete (String table, String whereClause, String[] whereArgs)
不用说了,用于删除表中的数据。
(4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
名字很长是吧,它的功能也很强大,用于查询数据库中的数据。
(5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
用于修改数据。根据传入参数的名字可以对使用方法略知一二。
(6)public void execSQL (String sql, Object[] bindArgs)
public void execSQL (String sql)
Cursor
Cursor没有构造方法,只能通过query方法获得。
在SQLiteDatabase上调用qyery方法将返回一个Cuesor。提供了对数据库查询所返回结果的读和写访问。
将Cursor移动到一个数据行,通过调用Cursor的getInt、getFloat、getLong、getString、getShort或getDouble方法传入索引,,从一行中读取列。
代码托管
问题及解决
SQLiteDatabase方法(6)第一个重写方法中bindArgs表示的是一些什么,用来做什么用,知道的同学可以告诉我下,谢谢!
在第一个方法中,bindArgs这个参数是用来传入前一句的sql语句中未定义的参数的。例如 :
sql = "INSERT INTO some_table (Id, Name, Source, Filter, Target) VALUES (?,?,?,?,?)"
bindArgs = new String[]{"1", "Winiex", "some_source", "some_fileter", "some_target"}
在这个时候,bindArgs中的参数就会bind(绑定)到前一句的sql语句中,最终的被执行的sql语句就会变成:
INSERT INTO some_table (Id, Name, Source, Filter, Target) VALUES (1, "Winiex", "some_source", "some_filter", "some_target")
参考资料
《java和Android开发学习指南》
Android之使用SharedPreferences保存用户偏好参数
采用SharedPreferences保存用户偏好设置参数和读取设置参数
android中的文件操作详解以及内部存储和外部存储
android中的数据库操作