一个简单的Sqlite双备份代码

在使用数据库过程中,如果数据库文件只在内部存储器中创建,可能会被删除掉导致数据丢失(root后进入data/data下删除应用的sqlite文件),为了防止这种情况发生,可以进行数据库文件在sdcard中进行一次备份。以下是一个简单双备份数据库代码类,主要功能是实现在数据库中进行键值对存储,并且数据库及保存在内部存储器中,又保存在sdcard中.

/**
 * @author xiaoli
 * 下面是一个数据库双备份使用实例代码,双备份的好处在于,如果用户误删了内部存储器中数据库文件我们依然可以读取外部存储器的数据库
 */
public class DoubleBackUpDB
{
	
	private String DB_NAME = ".DoubleBackUpDB.db";
	private static Object syncObj = new Object();
	//内部存储器路径
	public final String privateDbPath;
	//外部存储器路径(Sdcard)
	public final String sdcardDbPath;
	//表名
	String TBL_NAME;
	//SQ创建语句
	String CREATE_TBL;
	/**
	 * 创建数据库
	 * @param path 数据库的创建路径
	 */
	void createDb(
			String path )
	{
		SQLiteDatabase db = null;
		try
		{
			db = getDatabase( path );
		}
		catch( Exception e )
		{
		}
		try
		{
			db.close();
		}
		catch( Exception ex )
		{
		}
	}
	/**
	 * 
	 * @param context
	 * @param sdcardDbPath 构造函数需要传入存放数据库的sdcard路径
	 * @param moduleName 就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件.
	 */
	public DoubleBackUpDB(
			Context context ,
			String sdcardDbPath ,
			String moduleName )
	{
		this( context , sdcardDbPath , moduleName , null );
	}
	/**
	 * 
	 * @param context
	 * @param sdcardDbPath 构造函数需要传入存放数据库的sdcard路径
	 * @param moduleName 就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件.
	 * @param dbFileName 可以重命名db文件名(为null则使用默认)
	 */
	public DoubleBackUpDB(
			Context context ,
			String sdcardDbPath ,
			String moduleName ,
			String dbFileName )
	{
		this.TBL_NAME = moduleName;
		if( dbFileName != null )
		{
			this.DB_NAME = dbFileName;
		}
		this.CREATE_TBL = "create table if not exists " + TBL_NAME + "(" + "key text primary key not null," + "value text" + ")";
		this.privateDbPath = context.getFilesDir().getAbsolutePath() + "/" + moduleName + DB_NAME;
		try
		{
			PackageInfo pkgInfo = context.getPackageManager().getPackageInfo( context.getPackageName() , 0 );
			sdcardDbPath = sdcardDbPath + "/" + pkgInfo.packageName + pkgInfo.versionName + moduleName + DB_NAME;
		}
		catch( Exception e )
		{
			sdcardDbPath = sdcardDbPath + "/" + context.getPackageName() + moduleName + DB_NAME;
		}
		this.sdcardDbPath = sdcardDbPath;
		synchronized( syncObj )
		{
			createDb( this.privateDbPath );
			createDb( this.sdcardDbPath );
		}
	}
	/**
	 * 
	 * @param dbPath 数据库的创建路径
	 * @return Sqlite数据库
	 */
	private SQLiteDatabase getDatabase(
			String dbPath )
	{
		try
		{
			new File( dbPath.substring( 0 , dbPath.lastIndexOf( "/" ) ) ).mkdirs();
			SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase( dbPath , null );
			try
			{
				db.execSQL( CREATE_TBL );
			}
			catch( Exception ex )
			{
			}
			return db;
		}
		catch( Exception e )
		{
			new File( dbPath.substring( 0 , dbPath.lastIndexOf( "/" ) ) ).mkdirs();
			SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase( dbPath , null );
			try
			{
				db.execSQL( CREATE_TBL );
			}
			catch( Exception ex )
			{
			}
			return db;
		}
	}
	
	public void setValue(
			String key ,
			Integer value )
	{
		setValue( key , value != null ? value.longValue() : null );
	}
	
	public void setValue(
			String key ,
			Long value )
	{
		setValue( key , value != null ? value.toString() : null );
	}
	
	public void setValue(
			String key ,
			String value )
	{
		synchronized( syncObj )
		{
			setStringToDB( privateDbPath , key , value );
			setStringToDB( sdcardDbPath , key , value );
		}
	}
	
	public Integer getInt(
			String key )
	{
		return getInt( key , null );
	}
	
	public Integer getInt(
			String key ,
			Integer defaultValue )
	{
		Long result = getLong( key );
		if( result == null )
		{
			return defaultValue;
		}
		return result.intValue();
	}
	
	public Long getLong(
			String key )
	{
		return getLong( key , null );
	}
	
	public Long getLong(
			String key ,
			Long defaultValue )
	{
		try
		{
			return Long.parseLong( getString( key ) );
		}
		catch( Exception e )
		{
			return defaultValue;
		}
	}
	
	public String getString(
			String key ,
			String defaultValue )
	{
		String result = getString( key );
		if( result == null )
		{
			return defaultValue;
		}
		return result;
	}
	
	public String getString(
			String key )
	{
		synchronized( syncObj )
		{
			String value = getStringFromDB( privateDbPath , key );
			if( value == null )
			{
				value = getStringFromDB( sdcardDbPath , key );
			}
			return value;
		}
	}
	/**
	 * 通过key值查询数据库相应的内容
	 * @param dbPath 数据库路径
	 * @param key 键值
	 * @return 查询结果
	 */
	private String getStringFromDB(
			String dbPath ,
			String key )
	{
		String value = null;
		SQLiteDatabase db = null;
		Cursor c = null;
		try
		{
			db = getDatabase( dbPath );
			c = db.query( TBL_NAME , null , "key='" + key + "'" , null , null , null , null );
			if( c.moveToFirst() )
			{
				value = c.getString( 1 );
			}
		}
		catch( Exception e )
		{
		}
		finally
		{
			try
			{
				c.close();
			}
			catch( Exception e )
			{
			}
			try
			{
				db.close();
			}
			catch( Exception e )
			{
			}
		}
		return value;
	}
	/**
	 * 储存内容到数据库
	 * @param dbPath 数据库路径
	 * @param key 键值
	 * @param value 实际存入值
	 */
	private void setStringToDB(
			String dbPath ,
			String key ,
			String value )
	{
		SQLiteDatabase db = null;
		Cursor c = null;
		try
		{
			db = getDatabase( dbPath );
			if( value != null )
			{
				ContentValues content = new ContentValues();
				content.put( "key" , key );
				content.put( "value" , value );
				c = db.query( TBL_NAME , null , "key='" + key + "'" , null , null , null , null );
				if( c.moveToFirst() )
				{
					db.update( TBL_NAME , content , "key='" + key + "'" , null );
				}
				else
				{
					db.insert( TBL_NAME , null , content );
				}
			}
			else
			{
				db.delete( TBL_NAME , "key='" + key + "'" , null );
			}
		}
		catch( Exception e )
		{
		}
		finally
		{
			try
			{
				c.close();
			}
			catch( Exception e )
			{
			}
			try
			{
				db.close();
			}
			catch( Exception e )
			{
			}
		}
	}
}

已上传附件,可以直接拿来修改使用.

你可能感兴趣的:(android,SqLite双备份)