将 Robolectric 与 SQLiteAssetHelper 结合使用

2024-03-07

我对 Robolectric 很陌生,所以如果我在这里遗漏了一些明显的东西,请提前道歉。我有一个从以下位置加载数据库的应用程序assets目录使用SQLite资产助手 https://github.com/jgilfelt/android-sqlite-asset-helper,我想使用测试该数据库机器人电动 http://robolectric.org框架。我可以获得对数据库的引用,但它似乎是空的。 SQLiteAssetHelper 向日志输出“成功打开数据库”消息,但数据库中没有表。

Edit:这是我用来获取数据库的代码setUp使用下面发布的类@user2953017的方法:

@Before
public void setUp() {
    Context context = Robolectric.getShadowApplication().getApplicationContext();
    SQLiteDatabase db = (new DataBaseWrapper(context)).getReadableDatabase();

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    if (!c.moveToFirst()) {
        Log.w("debug", "No tables!");
    }  

    // My second query here fails, since the database contains no tables.
}

从日志猫:

W/debug: No tables!
DEBUG: Loading resources for android from jar:/home/<name>/.m2/repository/org/robolectric/android-res/4.1.2_r1_rc/android-res-4.1.2_r1_rc-real.jar!/res...
E/Debug: java.lang.RuntimeException: SQL exception in query

SQL异常的原因是没有找到查询中指定的表名。

如果有任何建议,我将不胜感激。


首先将数据库从资产文件夹复制到应用程序数据库文件夹。 这是复制数据库的代码

public class DataBaseWrapper extends SQLiteOpenHelper
 {
  private static String TAG = DataBaseWrapper.class.getName();
  private  String DB_PATH; //= "/data/data/com.example.yourproject/databases/";
  private static String DB_NAME = "Database.sqlite";
  private SQLiteDatabase myDataBase = null; 
  private final Context myContext;

  public DataBaseWrapper(Context context) 
  {
     super(context, DB_NAME, null, 1);

      this.myContext = context;
      DB_PATH="/data/data/" + context.getPackageName() + "/" + "databases/";
      Log.v("log_tag", "DBPath: " + DB_PATH);
     //  File f=getDatabasePath(DB_NAME);
  } 

  public void createDataBase() throws IOException{
   boolean dbExist = checkDataBase();
   if(dbExist){
    Log.v("log_tag", "database does exist");
    }else{
     Log.v("log_tag", "database does not exist");
     this.getReadableDatabase();
     try {
      copyDataBase();
        } catch (IOException e) {
      throw new Error("Error copying database");
      }
    }
   }

  private void copyDataBase() throws IOException{
  InputStream myInput = myContext.getAssets().open(DB_NAME);
  String outFileName = DB_PATH + DB_NAME;
  OutputStream myOutput = new FileOutputStream(outFileName);
  byte[] buffer = new byte[1024];
  int length;
   while ((length = myInput.read(buffer))>0){
    myOutput.write(buffer, 0, length);
   }
   myOutput.flush();
   myOutput.close();
   myInput.close();
  }

  private boolean checkDataBase(){

     File dbFile = new File(DB_PATH + DB_NAME); 
     //Log.v("dbFile", dbFile + "   "+ dbFile.exists()); 
     return dbFile.exists(); 

 }

 public boolean openDataBase() throws SQLException
 {
    String mPath = DB_PATH + DB_NAME; 
    //Log.v("mPath", mPath); 
    myDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
    //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    return myDataBase != null; 

 }


  @Override
  public synchronized void close() 
  {
     if(myDataBase != null)
      myDataBase.close();
     super.close();
  }

 @Override
 public void onCreate(SQLiteDatabase db) 
 {


  }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
 {
    Log.v(TAG, "Upgrading database, this will drop database and recreate.");
  }
  }

另请检查此链接..它可能对您有用在 Robolectric 中测试 SQLite 数据库 https://stackoverflow.com/questions/7320820/testing-sqlite-database-in-robolectric?rq=1

尝试这些事情:

1.从终端删除您的数据库

adb shell
cd /data/data/com.example.apploicationname/databases
rm *

并在模拟器上再次重新安装您的应用程序。

  1. 尝试增加模拟器的 RAM.. 尽管数据库中有所有数据,但我还是遇到了同样的错误,但是当我将模拟器的 RAM 从 1024 增加到 2000 时.. 它起作用了。

  2. 将数据库从 DDMS 复制到系统文件系统并通过 sqlite 浏览器打开它并检查表是否存在。 sqlite 浏览器的链接http://sourceforge.net/projects/sqlitebrowser/files/sqlitebrowser/ http://sourceforge.net/projects/sqlitebrowser/files/sqlitebrowser/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Robolectric 与 SQLiteAssetHelper 结合使用 的相关文章

  • onBackPressed 仅关闭 ProgressDialog

    我意识到我的异步任务有一个小问题 我意识到 当我按 Android 设备上的后退按钮来关闭进度对话框和异步任务时 只有我的进度对话框被关闭 而我的异步任务仍在执行 我真的不知道为什么会发生这种情况 所以我只是希望有人能让我回到正确的轨道并帮
  • Android Wear:在手持设备上启动服务

    我正在构建一个 Wear 应用程序 它将与手持设备上的 WearableListenerService 进行通信 但是 我想确保当应用程序在手表上启动时服务已启动并运行 我最初的想法是发送意图或广播消息来启动服务 但是 我一直无法弄清楚如何
  • ViewPager 显示的第一个片段与 FragmentStatePager 总是错误的

    我正在尝试拥有相同的view pager tabs设计为 PlayStore 5 1 x 这是我的布局
  • AdMob 广告未显示

    因此 我使用 Play Services SDK 实施了 AdMob 广告 我已经 按照书本 做了所有事情 但广告不会显示 如果我将 AdView 背景设置为白色 它会显示空白 但不显示广告 我正在使用 Fragments 但我将 AdVi
  • 如何使用 zXing 在 Android 中创建 IntentIntegrator

    我想创建一个对象IntentIntegrator在安卓中 IntentIntegrator integrator new IntentIntegrator ZBarReaderActivity this Here ZBarReaderAct
  • 删除SD卡上的文件夹

    I tried File delete 但它不起作用 如何删除SD卡上的目录 我正在开发 Android 2 1 在删除目录本身之前 您必须将所有目录清空 请参阅here http www rgagnon com javadetails j
  • 如何实现可运行队列

    我正在尝试实现一个可运行队列 在异步任务期间依次执行 意味着队列中的下一个将在另一个完成后执行 我编写了一个管理器来管理这些可运行对象和本身就是可运行对象的任务 然后 我获取异步任务中的第一个任务并运行它 希望它能够在队列中运行 但是它最终
  • Android 缩放和密度问题

    Update 一些研究表明 华硕 Transformer TF700T 高端 的像素密度应约为 224 因此 android 报告的 159 值要么是错误的 要么已被某种方式修改 system 中的 lcd 密度键 build prop 由
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • 如何以编程方式设置 ConstraintLayout 的 XML 属性“layout_constrainedWidth”?

    ConstraintLayout中 如何转换xml属性 app layout constrainedWidth true false in code 如果你想设置constrainedWidth Height以编程方式 那么你必须采取Con
  • 过滤列表视图并获取正确的 onclick 项目

    我有一个列表视图 并且已经实现了过滤 假设我有项目 A B 和 C 如果我在过滤框中输入 B 则只会显示项目 B 它是列表的位置 0 之前位于位置 1 因此 当我调用 onClick 项目时 我得到 id position 0 这导致显示有
  • Android HTTP PUT 请求

    谁能给我一个HTTP PUT请求 Android 的示例代码 假设您想使用 HttpURLConnection 要执行 HTTP PUT 请使用以下命令 URL url new URL http www example com resour
  • Android appwidget 远程视图未更新

    当我从某些活动更新小部件时 列表远程视图不会更新 我的意思是刷新自身 它会出现直到应用程序小部件的更新 日志显示 但不会进入列表视图的适配器以用新数据填充它 public void onUpdate Context context AppW
  • Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

    一段时间以来 我在 Android 游戏中遇到了运动精灵间歇性 卡顿 的情况 这是一个非常简单的 2D OpenGL ES 2 0 游戏 这是一个持续存在的问题 我已经多次重新访问过 在我的游戏循环中 我有 2 个 计时器 一个用于记录前一
  • 尝试在后台使用 AsyncTask 解析 JSON 时强制关闭

    我是 Android 开发新手 正在研究 json 数据 我设法让解析工作 我想显示一个 ProgressDialog 我读到我需要使用 AsyncTask 但由于某种原因 一旦我将相同的工作代码放入 doInBackground 中 即使
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一
  • 我收到“循环依赖”Android Dagger Hilt 错误

    我从头开始检查了所有内容 但找不到错误 我找不到错误 可能是什么 我收到以下编译错误 HomeViewModel java 6 error ComponentProcessor MiscError dagger internal codeg
  • onActivityResult() 在 startActivityForResult() 之后未使用 Intent.ACTION_GET_CONTENT 调用

    我得到了我的主要Activity其中持有不同的Fragment的 一个片段使用户可以打开一个DialogFragment 该对话框打开声音文件列表 并且该对话框还包含一个 添加 按钮 用户应该能够从中添加自己的声音文件 为此 我想使用标准的
  • 在片段视图之间切换

    在 xml 布局文件中声明片段的标准方法是
  • 从 NDK 获取应用程序名称

    我需要从本机端获取我的 Android 应用程序的名称 如下所示 android content context context android content context this current activiy Resources

随机推荐

  • 在 C# 中捕获本机 C++ 异常

    我有一些本机 C 类库 我将它们封装在 C NET 中 然后从 C 调用它们 三层 我可以从 C NET 中抛出异常 并愉快地在 C 中捕获它们 问题是 我捕获本机 C 异常的唯一方法是捕获 System Exception 这很好 但在从
  • 为什么 Java 从套接字读取随机数量而不是整个消息?

    我正在做一个项目 有一个关于 Java 套接字的问题 可以找到源文件here https github com ChrisLundquist Handbrake Network Queue blob master java src File
  • C++ - 如何计算字符频率?

    我需要编写代码来将唯一字符及其频率存储在动态数组中 随着新数据的到来 我需要增加它的大小 在这种情况下 新数据将是遇到的新字符 我想到的算法是每次读取给定字符串时检查已知字符列表 如果它是一个新字符 我需要将数组大小增加 1 如果它不是一个
  • clojure 是否具有与 C# 等价的 Yield?

    我正在读电子书Scala 和 Clojure 中的函数式编程模式 https pragprog com book mbfpp functional programming patterns in scala and clojure并找到了导
  • LAContext canEvaluatePolicy 和 Swift 2

    这是我的 Swift 代码 if LAContext canEvaluatePolicy LAPolicy DeviceOwnerAuthenticationWithBiometrics return true 使用 Swift2 我将代码
  • Spring Batch 访问步骤内的作业参数

    我有以下 Spring Batch Job 配置 Configuration EnableBatchProcessing public class JobConfig Autowired private JobBuilderFactory
  • Rails ActiveRecord - 有没有办法在没有 id 的情况下对表执行操作?

    我有一张一行两列的表格 int version datetime updated 是否有 Rails ActiveRecord 方法来获取和设置这些列中的数据 没有 id 列 我使用此表来跟踪其他表的查询版本 每次查询另一个表后 版本列都会
  • 我可以在 distcheck 期间使用 $dc_install_base 安装 systemd 文件吗?

    我有以下用于安装 systemd 服务文件的 Autotools 代码 该文件必须安装在外部 prefix到 pkg config 变量指定的目录 我知道这是不正确的 但我无法改变 systemd 的工作方式 配置文件 AC ARG WIT
  • OpenMPI 1.4.3 mpirun 主机文件错误

    我正在尝试在 4 个节点上运行一个简单的 MPI 程序 我正在使用在 Centos 5 5 上运行的 OpenMPI 1 4 3 当我使用主机文件 机器文件提交 MPIRUN 命令时 我没有得到任何输出 而是出现空白屏幕 因此 我必须终止这
  • Python 谷歌地图 驾驶时间

    我需要使用 Python 获取两组坐标之间的行驶时间 我能找到的唯一 Google Maps API 包装器要么使用 Google Maps API V2 已弃用 要么不具有提供驾驶时间的功能 我在本地应用程序中使用它 并且不希望受限于使用
  • 找出有盖矩形物体的方向、长度和半径

    I have a image as shown as fig 1 I am trying to fit this binary image with a capped rectangular fig 2 to figure out 方向 长
  • 更改 Xamarin 中格式化文本的字体

    我有一个带有格式化文本的标签 我想更改其字体样式 我的意思是字体 我尝试使用自定义标签渲染 就像对普通文本一样 但它没有得到反映 我的疑问是我们是否可以更改格式化文本的字体 因为它对于标签的文本 非格式化文本 工作正常 这是我的 xaml
  • 检查“组件”的渲染方法

    我正在尝试按照指南设置一个react router dom高阶组件 我有个问题说 元素类型无效 需要一个字符串 对于内置组件 或一个类 函数 对于复合组件 但得到 对象 您可能忘记从定义它的文件中导出组件 或者您可能混淆了默认导入和命名导入
  • jQuery:从文件系统读取文本文件

    我正在尝试使用 jquery 读取文本文件 如下所示 LOAD file and split line by line and append divs get myFile txt function data var lines data
  • 获取最近 7 天的日期

    我想获取从现在起过去 7 天的日期 例如当前日期是 02 10 2016 像这样获取 7 天的日期 01 10 2016 30 09 2016 29 09 2016 28 09 2016 27 09 2016 26 09 2016 My c
  • Java Servlet URL 映射

    我对java servlet相当陌生 如果这个问题看起来很愚蠢 请原谅我 我在 web xml servlet 选项卡中使用 netbeans 添加了 servlet 映射 例如 servlet 类和 url 模式 但是当应用程序运行时 它
  • 在 Firebase 函数中过滤数据

    如何找到 myPhone 的 users key 值 其值 123 我尝试过的 let usersRef admin database ref users usersRef orderByChild myPhone equalTo 123
  • 如何实现历史版本控制?

    我们正处于在 SQL 2008 R2 上构建大型 C MVC2 应用程序 我们还采用 Sharp 架构和 Nhibernate 作为生态系统的一部分 的早期阶段 其中一个要求是在给定的时间内可以访问所有数据库行版本 历史 我们尝试过类似以下
  • Meyers Singleton 与 C++-98 线程安全

    目前我有迈耶单例的实现 class ClassA public static ClassA GetInstance static ClassA instance return instance private ClassA ClassA a
  • 将 Robolectric 与 SQLiteAssetHelper 结合使用

    我对 Robolectric 很陌生 所以如果我在这里遗漏了一些明显的东西 请提前道歉 我有一个从以下位置加载数据库的应用程序assets目录使用SQLite资产助手 https github com jgilfelt android sq