Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我在测试项目的数据库中看不到记录?_Android_Robotium_Android Testing - Fatal编程技术网

Android 为什么我在测试项目的数据库中看不到记录?

Android 为什么我在测试项目的数据库中看不到记录?,android,robotium,android-testing,Android,Robotium,Android Testing,Hї 我已经为我的应用程序编写了测试。我需要使用robotium通过UI界面向数据库添加项,然后我想使用SQLiteDatabase检查数据库中是否存在项 在测试完成后,我在数据库中看到新记录,但我的测试类中的isExistsInDb返回false。我不明白为什么。你能帮帮我吗。 谢谢 活动类别: public abstract class EditActivity { // Some code ..... @Override public void onCreate

我已经为我的应用程序编写了测试。我需要使用robotium通过UI界面向数据库添加项,然后我想使用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();
        }

    }

}
更新:


如果我第二次运行测试,它会通过,因为数据库中存在由上一次测试添加的项。

在where clasue中使用“string”而不是string

"SELECT COUNT(*) FROM " + tableName + " WHERE " + commentFieldName + " = '" + comment + "'";
我建议使用参数化语句,您的方法是危险的,不太清楚。 更好的方法是使用getCount方法


更好的是,使用bindvariables@Dheeresh辛格:我改了语录。结果是一样的。
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;
}