加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

一个简单的Sqlite双备份代码

发布时间:2020-12-12 19:50:59 所属栏目:百科 来源:网络整理
导读:在使用数据库过程中,如果数据库文件只在内部存储器中创建,可能会被删除掉导致数据丢失(root后进入data/data下删除应用的sqlite文件),为了防止这种情况发生,可以进行数据库文件在sdcard中进行一次备份。以下是一个简单双备份数据库代码类,主要功能是实

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

/**
*@authorxiaoli
*下面是一个数据库双备份使用实例代码,双备份的好处在于,如果用户误删了内部存储器中数据库文件我们依然可以读取外部存储器的数据库
*/
publicclassDoubleBackUpDB
{
	
	privateStringDB_NAME=".DoubleBackUpDB.db";
	privatestaticObjectsyncObj=newObject();
	//内部存储器路径
	publicfinalStringprivateDbPath;
	//外部存储器路径(Sdcard)
	publicfinalStringsdcardDbPath;
	//表名
	StringTBL_NAME;
	//SQ创建语句
	StringCREATE_TBL;
	/**
	*创建数据库
	*@parampath数据库的创建路径
	*/
	voidcreateDb(
			Stringpath)
	{
		SQLiteDatabasedb=null;
		try
		{
			db=getDatabase(path);
		}
		catch(Exceptione)
		{
		}
		try
		{
			db.close();
		}
		catch(Exceptionex)
		{
		}
	}
	/**
	*
	*@paramcontext
	*@paramsdcardDbPath构造函数需要传入存放数据库的sdcard路径
	*@parammoduleName就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件.
	*/
	publicDoubleBackUpDB(
			Contextcontext,StringsdcardDbPath,StringmoduleName)
	{
		this(context,sdcardDbPath,moduleName,null);
	}
	/**
	*
	*@paramcontext
	*@paramsdcardDbPath构造函数需要传入存放数据库的sdcard路径
	*@parammoduleName就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件.
	*@paramdbFileName可以重命名db文件名(为null则使用默认)
	*/
	publicDoubleBackUpDB(
			Contextcontext,StringmoduleName,StringdbFileName)
	{
		this.TBL_NAME=moduleName;
		if(dbFileName!=null)
		{
			this.DB_NAME=dbFileName;
		}
		this.CREATE_TBL="createtableifnotexists"+TBL_NAME+"("+"keytextprimarykeynotnull,"+"valuetext"+")";
		this.privateDbPath=context.getFilesDir().getAbsolutePath()+"/"+moduleName+DB_NAME;
		try
		{
			PackageInfopkgInfo=context.getPackageManager().getPackageInfo(context.getPackageName(),0);
			sdcardDbPath=sdcardDbPath+"/"+pkgInfo.packageName+pkgInfo.versionName+moduleName+DB_NAME;
		}
		catch(Exceptione)
		{
			sdcardDbPath=sdcardDbPath+"/"+context.getPackageName()+moduleName+DB_NAME;
		}
		this.sdcardDbPath=sdcardDbPath;
		synchronized(syncObj)
		{
			createDb(this.privateDbPath);
			createDb(this.sdcardDbPath);
		}
	}
	/**
	*
	*@paramdbPath数据库的创建路径
	*@returnSqlite数据库
	*/
	privateSQLiteDatabasegetDatabase(
			StringdbPath)
	{
		try
		{
			newFile(dbPath.substring(0,dbPath.lastIndexOf("/"))).mkdirs();
			SQLiteDatabasedb=SQLiteDatabase.openOrCreateDatabase(dbPath,null);
			try
			{
				db.execSQL(CREATE_TBL);
			}
			catch(Exceptionex)
			{
			}
			returndb;
		}
		catch(Exceptione)
		{
			newFile(dbPath.substring(0,null);
			try
			{
				db.execSQL(CREATE_TBL);
			}
			catch(Exceptionex)
			{
			}
			returndb;
		}
	}
	
	publicvoidsetValue(
			Stringkey,Integervalue)
	{
		setValue(key,value!=null?value.longValue():null);
	}
	
	publicvoidsetValue(
			Stringkey,Longvalue)
	{
		setValue(key,value!=null?value.toString():null);
	}
	
	publicvoidsetValue(
			Stringkey,Stringvalue)
	{
		synchronized(syncObj)
		{
			setStringToDB(privateDbPath,key,value);
			setStringToDB(sdcardDbPath,value);
		}
	}
	
	publicIntegergetInt(
			Stringkey)
	{
		returngetInt(key,null);
	}
	
	publicIntegergetInt(
			Stringkey,IntegerdefaultValue)
	{
		Longresult=getLong(key);
		if(result==null)
		{
			returndefaultValue;
		}
		returnresult.intValue();
	}
	
	publicLonggetLong(
			Stringkey)
	{
		returngetLong(key,null);
	}
	
	publicLonggetLong(
			Stringkey,LongdefaultValue)
	{
		try
		{
			returnLong.parseLong(getString(key));
		}
		catch(Exceptione)
		{
			returndefaultValue;
		}
	}
	
	publicStringgetString(
			Stringkey,StringdefaultValue)
	{
		Stringresult=getString(key);
		if(result==null)
		{
			returndefaultValue;
		}
		returnresult;
	}
	
	publicStringgetString(
			Stringkey)
	{
		synchronized(syncObj)
		{
			Stringvalue=getStringFromDB(privateDbPath,key);
			if(value==null)
			{
				value=getStringFromDB(sdcardDbPath,key);
			}
			returnvalue;
		}
	}
	/**
	*通过key值查询数据库相应的内容
	*@paramdbPath数据库路径
	*@paramkey键值
	*@return查询结果
	*/
	privateStringgetStringFromDB(
			StringdbPath,Stringkey)
	{
		Stringvalue=null;
		SQLiteDatabasedb=null;
		Cursorc=null;
		try
		{
			db=getDatabase(dbPath);
			c=db.query(TBL_NAME,null,"key='"+key+"'",null);
			if(c.moveToFirst())
			{
				value=c.getString(1);
			}
		}
		catch(Exceptione)
		{
		}
		finally
		{
			try
			{
				c.close();
			}
			catch(Exceptione)
			{
			}
			try
			{
				db.close();
			}
			catch(Exceptione)
			{
			}
		}
		returnvalue;
	}
	/**
	*储存内容到数据库
	*@paramdbPath数据库路径
	*@paramkey键值
	*@paramvalue实际存入值
	*/
	privatevoidsetStringToDB(
			StringdbPath,Stringkey,Stringvalue)
	{
		SQLiteDatabasedb=null;
		Cursorc=null;
		try
		{
			db=getDatabase(dbPath);
			if(value!=null)
			{
				ContentValuescontent=newContentValues();
				content.put("key",key);
				content.put("value",value);
				c=db.query(TBL_NAME,null);
				if(c.moveToFirst())
				{
					db.update(TBL_NAME,content,null);
				}
				else
				{
					db.insert(TBL_NAME,content);
				}
			}
			else
			{
				db.delete(TBL_NAME,null);
			}
		}
		catch(Exceptione)
		{
		}
		finally
		{
			try
			{
				c.close();
			}
			catch(Exceptione)
			{
			}
			try
			{
				db.close();
			}
			catch(Exceptione)
			{
			}
		}
	}
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读