android 序列化存储对象,android中對象序列化存儲

項目中要存儲一些數據為了提高不必要的網絡請求,提高效率,用到數據持久化的知識點,針對這個問題,解決辦法其實有很多,以前在項目中是服務獲取到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中數據持久化的深刻理解需要看《第一行代碼》中第六章數據持久化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值