问题描述
我有一个可以在移动设备上运行且没有此数据库错误的应用程序,但是我试图在不使用移动设备的情况下添加测试以用于将来的版本...
我在运行功能数据库测试时遇到此错误,这是我的测试代码:
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 (将#修改为@)