在Android中一般实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例模式,确实很方便。
单利模式的定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
描述:单例模式注意事项:只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。不要做断开单例类对象与类中静态引用的危险操作。多线程使用单例使用共享资源时,注意线程安全问题。
使用方法介绍:
首先,要使用单利模式创建的时候需要实现Serializable接口。以AreaManage类为例;下同。
public class AreaManage implements Serializable { }
其次,定义类和上下文对象,实现getInstance()
public static AreaManage getInstance() {
if (sAreaManage == null) {
sAreaManage = new AreaManage();
}
return sAreaManage;
}
public static AreaManage getInstance(Context context) {
if (sAreaManage == null) {
sAreaManage = new AreaManage();
}
mContext = context;
return sAreaManage;
}
最后,在你的这个类中写你需要实现的业务。以与本地数据库交互为例:
/**
*
* 查询数据
*
* @param 参数说明
* @return 返回类型
* @exception 异常描述
* @see 需要参见的其它内容
* @since 从类的哪一个版本,此方法被添加进来。(可选)
* @deprecated该方法从类的那一个版本后,已经被其它方法替换。(可选)
*/
public int getDateNum() {
try {
String sql = "select * from " + SAreaTb.TableName;
Cursor cr = InestigationDataBase.query(sql);
if (cr.getCount() == 0) {
cr.close();
return 0;
} else {
int n = cr.getCount();
cr.close();
return n;
}
} catch (Exception e) {
System.out.println(e.getMessage());
return 1;
}
}
调用的方法:
AreaManage.getInstance().getDateNum()
package com.gytech.manage;
import java.io.Serializable;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import com.gytech.entity.SArea;
import com.gytech.tools.db.InestigationDataBase;
import com.gytech.tools.db.InestigationTable.SAreaTb;
public class AreaManage implements Serializable {
/**
* serialVersionUID:TODO(用一句话描述这个变量表示什么)
*
* @since 1.0.0
*/
private static final long serialVersionUID = 1L;
public static AreaManage sAreaManage;
public static Context mContext;
public static AreaManage getInstance() {
if (sAreaManage == null) {
sAreaManage = new AreaManage();
}
return sAreaManage;
}
public static AreaManage getInstance(Context context) {
if (sAreaManage == null) {
sAreaManage = new AreaManage();
}
mContext = context;
return sAreaManage;
}
/**
*
* 查询数据
*
* @param 参数说明
* @return 返回类型
* @exception 异常描述
* @see 需要参见的其它内容
* @since 从类的哪一个版本,此方法被添加进来。(可选)
* @deprecated该方法从类的那一个版本后,已经被其它方法替换。(可选)
*/
public int getDateNum() {
try {
String sql = "select * from " + SAreaTb.TableName;
Cursor cr = InestigationDataBase.query(sql);
if (cr.getCount() == 0) {
cr.close();
return 0;
} else {
int n = cr.getCount();
cr.close();
return n;
}
} catch (Exception e) {
System.out.println(e.getMessage());
return 1;
}
}
/**
*
* @param sqlStr
* @return
* @Description: 判断某一行的sql是否能够执行,如果sid值不存在在,或者sid对应的记录存在,则不去添加这条记录,
*/
public synchronized boolean checkHasDate(String sqlStr) {
String id = sqlStr.substring(sqlStr.indexOf("(") + 1,
sqlStr.indexOf(","));
if (id.length() == 0)
return true;
try {
String sql = "select * from " + SAreaTb.TableName + " where "
+ SAreaTb.SID + "='" + id + "'";
Cursor cr = InestigationDataBase.query(sql);
if (cr.getCount() == 0) {
cr.close();
return false;
} else {
cr.close();
return true;
}
} catch (Exception e) {
System.out.println(e.getMessage());
return true;
}
}
/**
* 更新数据
*
* @param sql语句
*/
public void inertOrUpdateDateBatch(String sql) {
try {
InestigationDataBase.insert(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
//
}
}
/**
*
* @param Sid
* @return
*/
public SArea getSAreaBySid(int Sid) {
SArea model = new SArea();
try {
String sql = "select * from " + SAreaTb.TableName + " where "
+ SAreaTb.SID + "='" + Sid + "'";
Cursor cr = InestigationDataBase.query(sql);
if (cr.moveToNext()) {
model.setSid(cr.getLong(cr.getColumnIndex(SAreaTb.SID)));
model.setAreaName(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_NAME)));
model.setAeraCode(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_CODE)));
model.setParentCityCode(cr.getString(cr
.getColumnIndex(SAreaTb.PARENT_CITY_CODE)));
}
cr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
return model;
}
public SArea getSAreaByAreaCode(String areaCode) {
SArea model = new SArea();
try {
String sql = "select * from " + SAreaTb.TableName + " where "
+ SAreaTb.AREA_CODE + "='" + areaCode + "'";
Cursor cr = InestigationDataBase.query(sql);
if (cr.moveToNext()) {
model.setSid(cr.getLong(cr.getColumnIndex(SAreaTb.SID)));
model.setAreaName(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_NAME)));
model.setAeraCode(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_CODE)));
model.setParentCityCode(cr.getString(cr
.getColumnIndex(SAreaTb.PARENT_CITY_CODE)));
model.setIsLeaf(cr.getInt(cr.getColumnIndex(SAreaTb.IS_LEAF)));
}
cr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
return model;
}
public ArrayList<SArea> getSAreaListByParentCityCode(String ParentDicCode) {
ArrayList<SArea> BaseClassList = new ArrayList<SArea>();
try {
String sql = "select * from " + SAreaTb.TableName + " where "
+ SAreaTb.PARENT_CITY_CODE + "='" + ParentDicCode + "'";
Cursor cr = InestigationDataBase.query(sql);
while (cr.moveToNext()) {
SArea model = new SArea();
model.setSid(cr.getLong(cr.getColumnIndex(SAreaTb.SID)));
model.setAreaName(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_NAME)));
model.setAeraCode(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_CODE)));
model.setParentCityCode(cr.getString(cr
.getColumnIndex(SAreaTb.PARENT_CITY_CODE)));
BaseClassList.add(model);
}
} catch (Exception e) {
// TODO Auto-generated catch block
// Sysout.printException(MarketManager.class +
// "=====获取营销活动的客户列表发生异常!", e);
System.out.println(e.getMessage());
return null;
}
//
return BaseClassList;
//
}
public SArea getByCityName(String Code) {
SArea model = new SArea();
try {
String sql = "select * from " + SAreaTb.TableName + " where "+SAreaTb.AREA_CODE + "='" + Code + "'";
Cursor cr = InestigationDataBase.query(sql);
while (cr.moveToNext()) {
model.setSid(cr.getLong(cr.getColumnIndex(SAreaTb.SID)));
model.setAreaName(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_NAME)));
model.setAeraCode(cr.getString(cr
.getColumnIndex(SAreaTb.AREA_CODE)));
model.setParentCityCode(cr.getString(cr
.getColumnIndex(SAreaTb.PARENT_CITY_CODE)));
}
} catch (Exception e) {
return null;
}
return model;
}
}