小编dir*_*ert的帖子

Android测试 - 从每个测试的干净数据库开始

我正在使用Android Instrumentation测试来测试我的应用程序.

所以我有一个ActivityInstrumentationTestCase2包含多个测试的测试类扩展.代码如下所示:

public class ManageProjectsActivityTestextends ActivityInstrumentationTestCase2<ManageProjectsActivity> {
    public ManageProjectsActivityTest() {
        super("eu.vranckaert.worktime", ManageProjectsActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        getInstrumentation().getTargetContext().deleteDatabase(DaoConstants.DATABASE);
        super.setUp();
        solo = new Solo(getInstrumentation(), getActivity());
    }

    @Override
    protected void runTest() throws Throwable {
        super.runTest();
        getActivity().finish();
    }

    public void testDefaults() {
        // My test stuff
    }

    public void testAddProject() {
        // My test stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,正在测试的活动有一个项目列表.从数据库中检索项目列表.当没有可用的数据库时,所以在创建数据库时,我插入一个默认项目.

这意味着当测试运行时,这就是我所说的:

  1. 数据库(如果可用)将在设备上删除
  2. 第一个测试开始(因此启动了活动,创建了一个项目的数据库)
  3. 测试使用新创建的数据库,因此只有一个项目,在测试期间创建第二个项目
  4. 第一个测试完成,再次调用setUp()方法
  5. 现在应该存在的数据库再次被删除
  6. 第二个测试开始(因此启动了活动,创建了一个项目的数据库)
  7. 第二次测试也结束了

但这不是这个测试套件的作用......这是我的测试套件的结果:

  1. 数据库(如果可用)将在设备上删除
  2. 第一个测试开始(因此启动了活动,创建了一个项目的数据库)
  3. 测试使用新创建的数据库,因此只有一个项目,在测试期间创建第二个项目
  4. 第一个测试完成,再次调用setUp()方法
  5. 现在应该存在的数据库再次被删除
  6. 它来了:第二个测试开始了(但是我的数据库没有再次创建!!!我无法在设备上看到文件......)测试应该只显示一个项目,但它确实已经显示二!!!
  7. 第二次测试也完成但失败了,因为我在开始时有两个项目......

在开始时我没有覆盖runTest()方法,但我认为也许我应该自己结束活动以强制重新创建,但它没有任何区别.

所以似乎DB保存在内存中(因为当我明确删除它时,甚至没有在设备上创建新的DB文件).甚至是活动,因为当在活动的onCreate中放置一个断点a时,我只会在那里进行两次测试.

为了维护DB我使用ORMLite.您可以在此处查看我的帮助程序类: …

sqlite

6
推荐指数
3
解决办法
6626
查看次数

Android备份和还原SD卡的数据库

我目前正在寻找在我的Android应用程序中构建备份功能.然而,在开始实施它之前,我有点挣扎,因为我不确定正确的方法是什么.

我在网上发现了一些有趣的文章,所以我提出了三种可能的解决方案:

  1. 将整个DB文件备份到SD卡
  2. 将DB数据导出到SD卡上的XML文件
  3. 使用Android备份机制将整个数据库备份到Google云

现在我想知道你们对这三种解决方案的想法,或者你知道另一种解决方案(也许是更好的方法),你眼中的最佳方式是什么?

以下是我对可能的实现的评论:

  1. 我不知道手机是否没有根据可以恢复数据库文件...否则我认为没有真正的任何不利因素...
  2. 在Android手机上动态处理XML文件很重,如果可以避免,最好不要这样做
  3. 使用Android备份机制,备份功能仅在用户在手机上启用时才可用,并且所有数据都应该复制到云端......在我的情况下,在某些情况下可能会有很多...

我期待在这个问题上看到一些意见!

提前致谢!

KR,

短剑

sqlite android android-sdcard

5
推荐指数
1
解决办法
6530
查看次数

Android和OpenGL在启动时提供黑框

我正在为一个拥有GLSurfaceView和GLSurfaceView.Renderer的客户编写一个Android应用程序.

我的整个OpenGL工作正常(它基本上是另一个开发人员首先在iOS上编写的端口).除了一件事.当加载视图并因此加载OpenGL的东西时,我的背景快速闪烁黑色,然后OpenGL开始正确渲染(使用我的背景).所以我做的是:

在onSurfaceCreated中我从这开始:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.9f + 0.1f * (21.0f / 255),
            0.9f + 0.1f * (36.0f / 255),
            0.9f + 0.1f * (31.0f / 255), 1.0f);

    // Here goes my other stuff, if I comment all my other stuff out I still get the flash at startup
}
Run Code Online (Sandbox Code Playgroud)

在我的onDrawFrame方法中,我这样做:

@Override
public void onDrawFrame(GL10 gl) {

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    // My stuff, again, if I comment all this stuff out I still get the …
Run Code Online (Sandbox Code Playgroud)

android renderer glsurfaceview opengl-es-2.0

5
推荐指数
1
解决办法
1642
查看次数

重新打开并替换片段时 Android 应用程序崩溃

对于我当前正在编写的应用程序,我已经实现了一个导航抽屉(具有向后兼容性的默认 Android 方式)。因此,从导航抽屉中选择一个菜单元素,然后我执行此操作(对于测试,addPreviousToBackStack 始终为 false):

private void replaceFragment(final Fragment fragment, final boolean addPreviousToBackStack) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.activity_main_fragment_container, fragment);
    if(addPreviousToBackStack) {
        fragmentTransaction.addToBackStack(fragment.getTag());
    }
    fragmentTransaction.commit();
    currentFragment = fragment;
}
Run Code Online (Sandbox Code Playgroud)

所以当我启动应用程序时,这就像一个魅力。然后我使用后退按钮关闭应用程序。如果我随后重新打开应用程序(无论如何:通过长按主页按钮或通过快捷方式),应用程序将从初始屏幕启动(调用 onCreate),然后打开导航抽屉并选择一个菜单项,应用程序崩溃。

这是我的异常:“java.lang.IllegalStateException:无法在 onSaveInstanceState 之后执行此操作”

它恰好发生在我所做的事情上

fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我不知道为什么在重新打开应用程序时而不是在最初打开应用程序时收到此消息。有什么线索吗??

java android fragment android-fragments

5
推荐指数
1
解决办法
2873
查看次数