com.almworks.sqlite4java.SQLiteException:在Android Studio中使用Robolectric运行数据库测试时,不会出现此类表错误

问题描述

我有一个可以在移动设备上运行且没有此数据库错误的应用程序,但是我试图在不使用移动设备的情况下添加测试以用于将来的版本...

我在运行功能数据库测试时遇到此错误,这是我的测试代码:

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import androidx.test.core.app.ApplicationProvider
import com.systango.myApp.auxiliares.DBSQLiteHelper
import com.systango.myApp.modelo.Libro
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import java.io.IOException

/**
 * Example local unit test,which will execute on the development machine (host).
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(RobolectricTestRunner::class)
class ExampleUnitTest {
    private lateinit var db: SQLiteDatabase

    @Before
    fun createDB() {
        val context = ApplicationProvider.getApplicationContext<Context>()
        val sqLiteHelper = DBSQLiteHelper(context)
        db = sqLiteHelper.readableDatabase
    }

    @After
    @Throws(IOException::class)
    fun closeDb() {
        db.close()
    }

    @Test
    fun addition_isCorrect() {
        assertEquals(4,2 + 2)
    }

    @Test
    fun obt_ok() {
        val libro = getLibro("2")
        assertEquals(1,1)
    }

    private fun getLibro(idLibro: String?): Libro {
        val table = "TBL_LIBROS"
        val columnsToReturn = arrayOf("ID_LIBRO","LIBRO","ABREVIATURA")
        val selection = "id_libro = ?"
        val dbCursor = db.query(table,columnsToReturn,selection,arrayOf(idLibro),null,null)
        val libro = Libro()
        if(dbCursor.moveToFirst()){
            libro.idLibro = dbCursor.getString(0)
            libro.libro = dbCursor.getString(1)
            libro.abrev = dbCursor.getString(2)
        }
        dbCursor.close()

        return libro
    }
}

和错误日志:

android.database.sqlite.SQLiteException: Cannot prepare statement,base error code: 1

    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getSqliteException(ShadowSQLiteConnection.java:761)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getFuture(ShadowSQLiteConnection.java:731)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:720)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:417)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:89)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1255)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1126)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1294)
    at com.systango.myApp.ExampleUnitTest.getLibro(ExampleUnitTest.kt:53)
    at com.systango.myApp.ExampleUnitTest.obt_ok(ExampleUnitTest.kt:45)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:256)
    at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.ExecutionException: com.almworks.sqlite4java.SQLiteException: [1] DB[1] prepare() SELECT ID_LIBRO,LIBRO,ABREVIATURA FROM TBL_LIBROS WHERE id_libro = ? [no such table: TBL_LIBROS]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:199)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getFuture(ShadowSQLiteConnection.java:726)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:720)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:417)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:89)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.$$robo$$android_database_sqlite_SQLiteConnection$acquirePreparedStatement(SQLiteConnection.java:903)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.$$robo$$android_database_sqlite_SQLiteConnection$prepare(SQLiteConnection.java:514)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java)
    at android.database.sqlite.SQLiteSession.$$robo$$android_database_sqlite_SQLiteSession$prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java)
    at android.database.sqlite.SQLiteProgram.$$robo$$android_database_sqlite_SQLiteProgram$__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java)
    at android.database.sqlite.SQLiteDirectCursorDriver.$$robo$$android_database_sqlite_SQLiteDirectCursorDriver$query(SQLiteDirectCursorDriver.java:46)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$android_database_sqlite_SQLiteDatabase$rawQueryWithFactory(SQLiteDatabase.java:1408)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$android_database_sqlite_SQLiteDatabase$queryWithFactory(SQLiteDatabase.java:1255)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$android_database_sqlite_SQLiteDatabase$query(SQLiteDatabase.java:1126)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$android_database_sqlite_SQLiteDatabase$query(SQLiteDatabase.java:1294)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java)
    at com.systango.myApp.ExampleUnitTest.getLibro(ExampleUnitTest.kt:53)
    at com.systango.myApp.ExampleUnitTest.obt_ok(ExampleUnitTest.kt:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    ... 14 more
Caused by: com.almworks.sqlite4java.SQLiteException: [1] DB[1] prepare() SELECT ID_LIBRO,ABREVIATURA FROM TBL_LIBROS WHERE id_libro = ? [no such table: TBL_LIBROS]
    at com.almworks.sqlite4java.SQLiteConnection.throwResult(SQLiteConnection.java:1309)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:487)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:542)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:529)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$2.call(ShadowSQLiteConnection.java:420)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$2.call(ShadowSQLiteConnection.java:417)
    ... 5 more

SQLHelper从OnCreate中的Assets创建数据库副本,并且在移动运行中没有问题...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...