項目中要存儲一些數據為了提高不必要的網絡請求,提高效率,用到數據持久化的知識點,針對這個問題,解決辦法其實有很多,以前在項目中是服務獲取到webservice的xml,然后直接將xml保存在本地,之后解析本地xml的格式,這種辦法是針對無參數的一些webservice的數據,比如給一個連接,就可以獲取到xml的數據,比如就是這樣寫的:
/**
* 更新教練的信息和圖片
* **/
public boolean updateData() {
boolean result;
SaveInfoTolocal saveInfoTolocal = new SaveInfoTolocal(context);
result = saveInfoTolocal.startSaveXml(Util.Coachinfor);
Log.i("result", Boolean.toString(result));
return result;
}其中的startSaveXml()這個方法的實現如下:
/**
* 獲取Webservice的xml文件,並開始保存文件
* */
public boolean startSaveXml(String method) {
Document document = getXml(URL + "/" + method);
if (document == null) {
SharedPreferences mySharedpreferences = context
.getSharedPreferences("com.xx", 0);
mySharedpreferences.edit().putString("infopath", "0").commit();// 清空路徑
return false;
}
return saveXmlToLocal(document, method + ".xml");
}
2.android中api提供的是SharePreferences這個類保存輕量級的數據,但是具體能保存多大的數據量,要進一步分析,保存string類型的很方便,保存list要自定義!
3.android 中還有就是 SQLiteOpenHelper是一個輔助類,用來管理數據庫的創建和版本他,它提供兩個方面的功能
* 第一,getReadableDatabase()、getWritableDatabase
* ()可以獲得SQLiteDatabase對象,通過該對象可以對數據庫進行操作
* 第二,提供了onCreate()、onUpgrade()兩個回調函數,允許我們再創建和升級數據庫時,進行自己的操作
如下操作:
package com.lu.SQLiteOpenHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.provider.BaseColumns;
/**
* SQLiteOpenHelper是一個輔助類,用來管理數據庫的創建和版本他,它提供兩個方面的功能
* 第一,getReadableDatabase()、getWritableDatabase
* ()可以獲得SQLiteDatabase對象,通過該對象可以對數據庫進行操作
* 第二,提供了onCreate()、onUpgrade()兩個回調函數,允許我們再創建和升級數據庫時,進行自己的操作
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "lhgolf.db";
public static final String USERS_TABLE = "users";
private static final int DATABASE_VERSION = 1;
/**
* 在SQLiteOpenHelper的子類當中,必須有該構造函數
*
* @param context
* 上下文對象
* @param name
* 數據庫名稱
* @param factory
* @param version
* 當前數據庫的版本,值必須是整數並且是遞增的狀態
*/
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
// 必須通過super調用父類當中的構造函數
super(context, name, factory, version);
}
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// 該函數是在第一次創建的時候執行,實際上是第一次得到SQLiteDatabase對象的時候才會調用這個方法
@Override
public void onCreate(SQLiteDatabase db) {
// execSQL用於執行SQL語句
/** 用戶表(用戶賬號,密碼) **/
db.execSQL("CREATE TABLE " + USERS_TABLE + " (" + BaseColumns._ID
+ " INTEGER PRIMARY KEY,userid VARCHAR,password VARCHAR);"); //該方法可以進行增刪改,不能查
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL("DROP TABLE IF EXISTS" + USERS_TABLE);
onCreate(db);
}
}
用在登陸用戶名和密碼,記住密碼的時候:
/**
*
* 設置默認設置,記錄密碼 記住密碼和用戶名
*
* */
private void recordpassword() {
if (login_username_edit.getText().toString().equals(""))
return;
databaseHelper = new MySQLiteHelper(getActivity());
db = databaseHelper.getWritableDatabase();
if (mRecordPwd.isChecked()) {//如果記住密碼按鈕已經被選擇了,就要把用戶名和密碼記錄到本地
Cursor cursor = db.rawQuery("select * from "
+ MySQLiteHelper.USERS_TABLE + " where userid='"
+ login_username_edit.getText().toString() + "'", null);
if (cursor.moveToNext()) {//如果沒有的話,表示沒有相同的用戶名存儲
db.execSQL("update " + MySQLiteHelper.USERS_TABLE
+ " set password='" + metPwd.getText().toString()
+ "' where userid='" + login_username_edit.getText() + "'");
} else {
db.execSQL("insert into " + MySQLiteHelper.USERS_TABLE
+ "(userid,password) values('"
+ login_username_edit.getText().toString() + "','"
+ metPwd.getText().toString() + "')");
}
db.close();
cursor.close();
cursor = null;
databaseHelper.close();
} else {//普通的記住用戶名,不用記住密碼
Cursor cursor = db.rawQuery("select * from "
+ MySQLiteHelper.USERS_TABLE + " where userid='"
+ login_username_edit.getText().toString() + "'", null);
String password="";//密碼為空
if (cursor.moveToNext()) {//如果沒有的話,表示沒有相同的用戶名存儲
db.execSQL("update " + MySQLiteHelper.USERS_TABLE
+ " set password='" + password
+ "' where userid='" + login_username_edit.getText() + "'");
} else {
db.execSQL("insert into " + MySQLiteHelper.USERS_TABLE
+ "(userid,password) values('"
+ login_username_edit.getText().toString() + "','"
+ password + "')");//密碼為空
}
db.close();
cursor.close();
cursor = null;
databaseHelper.close();
}
db = null;
databaseHelper = null;
}
關於android中SQLite使用的不熟練,用的很少,這個需要多加聯系,熟練掌握存儲數據的方便和及時!
4.就是Java中的對象序列化
對象序列化的目標是將對象保存到磁盤中,或允許在網絡中直接傳輸對象。對象序列化機制允許把內存中的Java對象轉換成平台無關的二進制流,從而允許把這種二進制流持久地保存在磁盤上,通過網絡將這種二進制流傳輸到另一個網絡節點。其他程序一旦獲得了這種二進制流(無論是從磁盤中獲取的,還是通過網絡獲取的),都可以將這種二進制流恢復成原來的Java對象。
下面是代碼實現:
首先需要對一個對象實現序列化接口
package com.lh.model;
import java.io.Serializable;
public class FoodCateModel implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String GoodsTypeName;
private String GoodsTypeID;
public String getGoodsTypeName() {
return GoodsTypeName;
}
public void setGoodsTypeName(String goodsTypeName) {
GoodsTypeName = goodsTypeName;
}
public String getGoodsTypeID() {
return GoodsTypeID;
}
public void setGoodsTypeID(String goodsTypeID) {
GoodsTypeID = goodsTypeID;
}
}
接下來就是保存和讀取對象的實現:
if (Util.Result.equals("1"))
{// 假設返回的用戶名不為空,表示已經有返回的數據了// 保存到本地的配置文件中try {FileSaveUtils.saveInfo(getcatelist,SaveInfoTolocal.getSavePath());// 哦,在這里呢,我沒看見} catch (Exception e) {e.printStackTrace();} // 這就存儲了sendMessage(Util.DOWNLOAD_twoOK, "");} elsesendMessage(Util.DOWNLOAD_OFFLINE, "");寫了一個工具類,保存和讀取對象到本地:
package com.lh.sale;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
public class FileSaveUtils {
/**
* 你可以把參數在抽象畫,然后存儲更加通用;如果捕捉到異常,沒辦法的話建議把異常不要拋出了
*/
public static void saveInfo(Object object, String path){
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(object);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param path
* @return 可能返回為null。需要判斷
*/
public static Object readInfo (String path) {
Object object = null;
ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(path));
try {
object = ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ois.close();
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return object;
}
}
關於android中數據持久化的深刻理解需要看《第一行代碼》中第六章數據持久化!