我在做数据库同步。在sql server和sqlite之间下载数据。如果在sqlite中更新/插入记录时存在某些情况,则互联网连接速度慢或丢失然后需要回滚。这可能在此代码中或如何在此处使用事务。
public void insertTableRecords(String strTableName, String[] strToFields, String[] strValues){
DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(DownlaodTableActivity.this);
dbAdapter.openDataBase();
ContentValues initialValues = new ContentValues();
for(int i=0 ;i<strToFields.length;i++){
initialValues.put(strToFields[i],strValues[i]);
}
long n = dbAdapter.insertRecordsInDB(strTableName, null, initialValues);
System.out.println( " -- inserted status : --- " + n);
}
请帮帮我。
提前致谢...
答案 0 :(得分:40)
以下是在SQLite中使用事务的简短示例(db是以下的SQLiteDatabase实例):
try {
db.beginTransaction();
// your sql stuff
db.setTransactionSuccessful();
} catch(SQLException e) {
// do some error handling
} finally {
db.endTransaction();
}
注意,重要的是你选择用抛出和异常替换“//你的sql东西”的任何方法。使用insertOrThrow()或者如果您需要更灵活的SQLiteStatement实例(它们的.execute方法总是会在出错时抛出异常)。
注意,您不需要显式回滚。如果在没有.setTransactionSuccessful()的情况下调用db.endTransaction(),它将自动回滚。
请记住,在最后一次抛出SQLException方法后,总是要设置setTransactionSuccessful:)
您可以使用另一个catch块轻松扩展它,以捕获网络超时的异常。
答案 1 :(得分:0)
此插入仅影响一个表。因此,通过检查变量n,您可以查找是否插入了数据。它之间没有任何内容。此处不需要任何事务。
答案 2 :(得分:0)
如果您的意思是回滚,请删除添加的行;这很简单......你可以为每个添加的行添加一个TIMESTAMP,并将其值设置为System.currentTimeMillis()
...保存第一个System.currentTimeMillis()
,如果要回滚,可以DELETE
从表中保存在程序中保存的时间戳之后添加的所有行
在您有一个完整的行之后,您似乎只更新了表...这是一个代码,可以帮助您确定手机是否仍然连接到网络,因此,您可以继续检索行或不
manifest
检查是否已连接并继续
ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = conManager.getActiveNetworkInfo();
if(networkInfo.isConnected()){
//YOUR CODE
}