Android sqlite回滚

时间:2011-08-02 08:30:55

标签: android sqlite

我在做数据库同步。在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);
}

请帮帮我。

提前致谢...

3 个答案:

答案 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
}