安卓存储四种方式
实质上只有两种方式:本地文件和远程网络存储方式。
File,SharedPreferences(xml),File,xml,SQLite,远程数据库
SharedPreferences存储方式 xml
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
五、获取数据,雷同,直接get(key);
// 存
源码示例
[
public static boolean save(Context context, Person person) {
try {
//获取sharedPreferences对象,参数(指定文件名,私有)
SharedPreferences sharedPreferences = context.getSharedPreferences("buluoUtilOfSharePerferences", context.MODE_PRIVATE);
//获取上获取Edit对象,写入操作
Editor edit = sharedPreferences.edit();
edit.putString("name", person.getName());
edit.putString("password", person.getPassword());
edit.putString("age", String.valueOf(person.getAge()));
edit.putString("gender", person.getGender());
edit.commit();
return true;
} catch (Exception e) {
}
return false;
}
]
// 取
源码示例
[
public static Person get(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences("buluoUtilOfSharePerferences", context.MODE_PRIVATE);
try {
Person person = new Person(
sharedPreferences.getString("name", null),
sharedPreferences.getString("password", null),
Integer.valueOf(sharedPreferences.getString("age", null)),
sharedPreferences.getString("gender", null)
);
return person;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
]
文件存储方式 File,Xml
File >>>
存储思路简单:不多写,输入输出字符流。
// 存
源码示例
[
String path = "/data/data/com.buluo.qqlogin/buluo28.txt";
String userInfo = number + "##" + password ;
FileOutputStream fos = new FileOutputStream(path);
fos.write(userInfo.getBytes());
fos.flush();
fos.close();
]
// 取
源码示例
[
String path = "/data/data/com.buluo.qqlogin/buluo28.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
char[] strs = new char[300];
while(reader.ready()){
reader.read(strs, 0, strs.length);
}
//String text = reader.readLine();
String text = strs.toString();
if(!TextUtils.isEmpty(text)){
String[] split = text.split("##");
Map<String, String> userInfoMap = new HashMap<String,String>();
userInfoMap.put("number", split[0]);
userInfoMap.put("password", split[1]);
return userInfoMap;
}
]
Xml >>>
存:
一,指定本地文件
二,获取序列化对象
三,序列化操作
源码示例
[
/**
* 写xml到本地
*/
public void saveXmlToLocal() {
//待序列队伍
List<Person> personList = getPersonList();
try{
//指定文件
File path = new File(Environment.getExternalStorageDirectory(),"personList.xml");
FileOutputStream fos = new FileOutputStream(path);
//序列化对象
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos , "utf-8");
//序列化操作
serializer.startDocument("utf-8",true);
serializer.startTag(null,"persons");
for(Person person : personList){
serializer.startTag(null,"person");
serializer.attribute(null,"id",String.valueOf(person.getId()));
serializer.startTag(null,"name"); //<name>
serializer.text(person.getName()); // 文本
serializer.endTag(null,"name"); //</name>
serializer.startTag(null,"password");
serializer.text(person.getPassword());
serializer.endTag(null,"password");
serializer.startTag(null,"age");
serializer.text(String.valueOf(person.getAge()));
serializer.endTag(null,"age");
serializer.startTag(null,"gender");
serializer.text(person.getGender());
serializer.endTag(null,"gender");
serializer.endTag(null,"person");
}
serializer.endTag(null,"persons");
serializer.endDocument();
}catch(Exception e){
}
}
]
取:
一,指定本地文件
二,获取序列化解析对象
三,解析操作
源码示例
[
/**
* 解析本地xml
* @return
*/
public List<Person> readXmlFromLocal() {
//反序列出临存
List<Person> personList = null;
Person person = null;
try {
// 指定文件
File file = new File(Environment.getExternalStorageDirectory(),"personList.xml");
FileInputStream fis = new FileInputStream(file);
// 获得解析器对象
XmlPullParser parser = Xml.newPullParser();
parser.setInput(fis, "utf-8"); //设置解析的文件和编码
int eventType = parser.getEventType(); //获取事件类型
//解析操作
while (eventType != XmlPullParser.END_DOCUMENT) { //这么多,当然得循环读了
String tagName = parser.getName(); //当前读到的标签名
switch (eventType) {
case XmlPullParser.START_TAG:
if("persons".equals(tagName)){
personList = new ArrayList<Person>();
}
if("person".equals(tagName)){
person = new Person();
person.setId(parser.getAttributeValue(null, "id"));
}
if("password".equals(tagName)){
person.setPassword(parser.nextText());
}
if("age".equals(tagName)){
person.setAge(Integer.parseInt(parser.nextText()));
}
if("gender".equals(tagName)){
person.setGender(parser.nextText());
}
if("name".equals(tagName)){
person.setName(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("person".equals(tagName)) {
personList.add(person); // 需要把上面设置好值的person对象添加到集合中
}
break;
default:
break;
}
eventType= parser.next(); //继续获取下一个事件类型
}
return personList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
]
SQLite 数据库方式
一.先继承API,继承类SQLiteOpenHelper类(这个类,内部做数据库的初始化操作)
二.在构造函数中,初始化数据库文件 .db
三.在onCreate()回调函数中,可做表的初始化操作
四.SQL方式和API方式
- 数据库帮助类
源码示例
[
/**
* 数据库帮助类,
* 主要是初始化数据库,表
* @author G510
*/
public class DictSQLiteOpenHelper extends SQLiteOpenHelper {
/**
* 数据库的构造函数
* @param context 上下文
* @param name 数据库名字
* @param factory 游标
* @param version 版本号
*/
public DictSQLiteOpenHelper(Context context) {
super(context, "test.db", null, 1);
}
/**
* 第一次回调此方法,创建数据库
*/
@Override
public void onCreate(SQLiteDatabase db) {
//操作数据库
String sql = "create table dict (_id integer primary key,word varchar(30),detail varchar(100));";
db.execSQL(sql); //创建dict表
}
/**
* 数据库的版本号更新时回调此方法,
* 更新数据库的内容(删除表,添加表,修改表)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
]
- dao 层SQL方式:无他,SQL会即可。
源码示例
[
public class DictDao {
private DictSQLiteOpenHelper dbHelper; // 数据库帮助类对象
public DictDao(Context context) {
dbHelper = new DictSQLiteOpenHelper(context);
}
public void insert(Dict dict) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
if (db.isOpen()) { // 如果打开,执行添加操作
db.execSQL("insert into dict(word,detail) values(?,?) ",
new String[] {dict.getWord(), dict.getDetail() });
// db.execSQL("insert into dict(_id,word,detail) values(?,?,?) ",
// new String[] { String.valueOf(dict.getId()),
// dict.getWord(), dict.getDetail() });
db.close(); // 用完关闭
}
}
public List<Dict> queryAll() {
List<Dict> list = new ArrayList<Dict>();
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
if (db.isOpen()) {
Cursor cursor = db.rawQuery("select _id,word,detail from dict",
null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String word = cursor.getString(1);
String detail = cursor.getString(2);
list.add(new Dict(id, word, detail));
}
db.close();
return list;
}
db.close();
}
return null;
}
}
]
- 测试类
源码示例
[
public class TestCase extends AndroidTestCase {
private static final String TAG = "TextCase_dao";
public void test() {
// 创建数据库版帮助对象
DictSQLiteOpenHelper dbHelper = new DictSQLiteOpenHelper(getContext());
// 第一次连接数据库时创建数据库文件,onCreate被调用了
dbHelper.getReadableDatabase();
}
public void testInsert() {
DictDao dao = new DictDao(getContext());
for (int i = 0; i < 10; i++) {
Dict dict = new Dict("love" + i, "love the gril" + i);
dao.insert(dict);
}
}
public void testQueryall() {
DictDao dao = new DictDao(getContext());
List<Dict> all = dao.queryAll();
for (Dict dict : all) {
Log.i(TAG, dict.toString());
}
}
}
]
- dao 层API方式:无他,注意函数的参数即可。
源码示例
[
public class DictDao2 {
private static final String TAG = "DictDao2";
private DictSQLiteOpenHelper dbHelper; // 数据库帮助类对象
public DictDao2(Context context) {
dbHelper = new DictSQLiteOpenHelper(context);
}
public void insert(Dict dict) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
if (db.isOpen()) {
ContentValues values = new ContentValues();
values.put("word", dict.getWord());
values.put("detail", dict.getDetail());
long id = db.insert("dict", "word", values);
Log.i(TAG, "id:" + id);
db.close(); // 用完关闭
}
}
public void deleteAll() {
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
if (db.isOpen()) { // 如果数据库打开,执行删除操作
db.delete("dict", null, null);
db.close();
}
}
public int deleteById(int id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
try {
if (db.isOpen()) { // 如果数据库打开,执行删除操作
String whereClause = " _id = ? ";
String[] whereArgs = { id + "" };
id = db.delete("dict", whereClause, whereArgs);
Log.i(TAG, "删除对象ID为:" + id);
db.close();// 数据库关闭
return id;
}
} catch (Exception e) {
}
return -1;
}
public int updateById(Dict dict) {
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
if (db.isOpen()) {// 更新操作
String whereClause = "_id = ? ";
String[] whereArgs = { String.valueOf(dict.getId()) };
ContentValues values = new ContentValues();
values.put("word", dict.getWord()); // 列,值
values.put("detail", dict.getDetail()); // 列,值
int affected = db.update("dict", values, whereClause, whereArgs);
db.close();
Log.i(TAG, "影响行数:" + affected);
}
return 0;
}
public List<Dict> queryAll() {
List<Dict> list = new ArrayList<Dict>();
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
if (db.isOpen()) {
String[] columns = { "_id", "word", "detail" };
Cursor cursor = db.query("dict", columns, null, null, null, null,
null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String word = cursor.getString(1);
String detail = cursor.getString(2);
list.add(new Dict(id, word, detail));
}
db.close();
return list;
}
db.close();
}
return null;
}
public Dict queryById(int id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();// 获取一个只读的数据库
Dict dict = null;
if (db.isOpen()) {
String[] columns = { "_id", "word", "detail" };
String selection = "_id = ? ";
String[] selectionArgs = { id + "" };
Cursor cursor = db.query("dict", columns, selection, selectionArgs,
null, null, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
dict = new Dict(cursor.getInt(0), cursor.getString(1),
cursor.getString(2));
}
db.close();
}
return dict;
}
return null;
}
}
]
网络存储方式