| package com.xtremelabs.robolectric.shadows; |
| |
| import android.database.sqlite.SQLiteDatabase; |
| import android.database.sqlite.SQLiteDoneException; |
| import android.database.sqlite.SQLiteStatement; |
| import com.xtremelabs.robolectric.internal.Implementation; |
| import com.xtremelabs.robolectric.internal.Implements; |
| |
| import java.sql.ResultSet; |
| import java.sql.SQLException; |
| |
| @Implements(SQLiteStatement.class) |
| public class ShadowSQLiteStatement extends ShadowSQLiteProgram { |
| String mSql; |
| |
| public void init(SQLiteDatabase db, String sql) { |
| super.init(db, sql); |
| mSql = sql; |
| } |
| |
| @Implementation |
| public void execute() { |
| if (!mDatabase.isOpen()) { |
| throw new IllegalStateException("database " + mDatabase.getPath() + " already closed"); |
| } |
| try { |
| actualDBstatement.execute(); |
| } catch (SQLException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Implementation |
| public long executeInsert() { |
| try { |
| actualDBstatement.executeUpdate(); |
| ResultSet resultSet = actualDBstatement.getGeneratedKeys(); |
| |
| if (resultSet.next()) { |
| return resultSet.getLong(1); |
| } else { |
| throw new RuntimeException("Could not retrive generatedKeys"); |
| } |
| } catch (SQLException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Implementation |
| public long simpleQueryForLong() { |
| ResultSet rs; |
| try { |
| rs = actualDBstatement.executeQuery(); |
| rs.next(); |
| return rs.getLong(1); |
| } catch (SQLException e) { |
| handleException(e); |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Implementation |
| public String simpleQueryForString() { |
| ResultSet rs; |
| try { |
| rs = actualDBstatement.executeQuery(); |
| rs.next(); |
| return rs.getString(1); |
| } catch (SQLException e) { |
| handleException(e); |
| throw new RuntimeException(e); |
| } |
| } |
| |
| private void handleException(SQLException e) { |
| if (e.getMessage().contains("No data is available")) { |
| //if the query returns zero rows |
| throw new SQLiteDoneException("No data is available"); |
| } else if (e.getMessage().contains("ResultSet closed")) { |
| //if the query returns zero rows (SQLiteMap) |
| throw new SQLiteDoneException("ResultSet closed,(probably, no data available)"); |
| } |
| } |
| } |