2012-06-23 41 views
0

Hї!爲什麼我沒有在我的測試項目中看到數據庫中的記錄?

我已經爲我的應用程序寫了測試。我需要通過UI界面(使用robotium)將數據添加到數據庫,然後我想使用SQLiteDatabase檢查數據庫中是否存在項目。

項目成功添加(我在數據庫中看到新的記錄,測試完成後),但isExistsInDb在我的測試類中返回false。我不懂爲什麼。你可以幫我嗎。 謝謝!

活動類:

public abstract class EditActivity { 


    // Some code ..... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     initButtonCancelOk(); 
    } 

    protected void validateAndSave() { 
     try { 
      formValidator.validateAll(); 
      if (formValidator.isFormValid()) { 
       DatabaseOpenHelper doh = new DatabaseOpenHelper(this); 
       Dao d = new Dao(doh); 
       d.add(fetchObjectFromUi()); 
       finish(); // destroy this activity 
      } else { 
       ToastImage.makeImageText(context, 
         R.drawable.warning, 
         formValidator.getMessages(), 
         Toast.LENGTH_SHORT 
        ).show(); 
      } 
     } catch (Exception e) { 
      Toast.makeText(context, " Error during validate form ", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } 

    private void initButtonCancelOk() { 
     btnOk = (Button) findViewById(R.id.btn_ok); 
     btnOk.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       validateAndSave(); 
      } 
     }); 
    }  
} 

測試類:

public class AddItemSmokeTest extends extends ActivityInstrumentationTestCase2<EditActivity> { 

    protected Activity activity; 
    protected Solo solo; 

    public AddItemSmokeTest() { 
     super("com.myapp", EditActivity.class); 
     Intent i = createIntent(2); 
     setActivityIntent(i); 
     activity = getActivity(); 
     solo = new Solo(getInstrumentation(), activity); 
     solo.sleep(1000); // interval between tests 
    } 

    protected Intent createIntent(long transType) { 
     Intent i = new Intent(); 
     i.putExtra(INTENT_VALUE_MODE_NAME, MODE_INSERT_TRANSACTION); 
     i.putExtra(INTENT_VALUE_TYPE_ID_NAME, transType); 
     return i; 
    } 

    @Override 
    protected void tearDown() throws Exception { 

    } 

    protected void setIncomExpenseData(AbsTransIncomeExpenseTestData testData) { 
     solo.pressSpinnerItem(CATEGORY_SPN_INDEX, testData.getCategorySpinnerPos()); 
     solo.pressSpinnerItem(ACCOUNT_SPN_INDEX, testData.getAccountSpinnerPos()); 
     solo.typeText((EditText) activity.findViewById(com.rirdev.moneycounter.R.id.et_sum), testData.getSum()); 
     solo.typeText((EditText) activity.findViewById(com.rirdev.moneycounter.R.id.et_comment), testData.getComment()); 
    } 

    @Smoke 
    public void testAddIncomeTransaction() throws Exception { 
     initForType(TransactionType.INCOME); 
     AbsTransIncomeExpenseTestData testData = new IncomeTestData(); 
     setIncomExpenseData(testData); 
     solo.clickOnButton(OK); 
     //solo.getActivityMonitor(); 
     assertTrue( 
        "Item" + testData.getComment() + " was not added ", 
        isExistsInDb(activity, Transactions.TABLE_NAME, Transactions.DESCRIPTION, testData.getComment()) 
       ); 
    } 

    protected static boolean isExistsInDb(Context context, String tableName, String commentFieldName, String comment) { 

     DatabaseOpenHelper doh = new DatabaseOpenHelper(context); 
     SQLiteDatabase db = doh.getDatabaseReadable(); 
     Cursor cursor = null; 
     try { 
      String query = "SELECT COUNT(*) FROM " + tableName + " WHERE " + commentFieldName + " = \"" + comment + "\""; 
      cursor = db.rawQuery(query, null); 
      cursor.moveToFirst(); 
      if (cursor.getInt(0) > 1) { 
       return true; 
      } 
      return false; 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
      db.close(); 
      doh.close(); 
     } 

    } 

} 

更新:

如果我運行測試,是因爲在數據庫中通過了第二次存在項目由以前添加測試。

在clasue使用「字符串」,而不是「字符串」

回答

1

我建議使用使用parametrized statement,你的做法是危險的,並沒有太多明確的。 還好得多用getCount()方法。

String query = "SELECT COUNT(*) FROM " + tableName + " WHERE columnName = ?"; 
cursor = db.rawQuery(query, new Sring[] {comment}); 
int count = 0; 
if (cursor.getCount() > 0) { 
    cursor.moveToFirst(); 
    count = cursor.getInt(0); 
} 
if (count > 0) { 
    return true; 
} 
else { 
    return false; 
} 
1

.....

"SELECT COUNT(*) FROM " + tableName + " WHERE " + commentFieldName + " = '" + comment + "'"; 
+1

更好,使用綁定變量 – Thilo

+0

@Dheeresh Singh我改變了引號。結果是一樣的。 – IgorOK

+0

if(cursor.getInt(0)> 1){最好使用cursor.getCount()... –

相關問題