gpt4 book ai didi

Android 单元测试 - SQLiteReadOnlyDatabaseException : Attempt to write a readonly database (code 1032)

转载 作者:行者123 更新时间:2023-11-30 00:55:05 25 4
gpt4 key购买 nike

我刚刚为我的 CRUD 实现创建了单元测试,但我遇到了这个奇怪的问题。当一项一项地运行测试时,它们都通过了。但是当我想运行整个套件时,它们因错误而失败

android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1367)
at cz.pikadorama.simpleorm.DatabaseSanityTest.testDelete(DatabaseSanityTest.java:55)

这是代码

@Before
public void prepareDatabase() throws InstantiationException, IllegalAccessException {
Context context = InstrumentationRegistry.getTargetContext();
context.deleteDatabase(DATABASE_NAME);
DbManager.registerHelper(new TestSQLiteHelper(context), new Class<?>[]{TestEntity.class});
}

@Test
public void testDelete() {
Dao<TestEntity> dao = DaoManager.getDao(TestEntity.class);
TestEntity entity = new TestEntity();
dao.create(entity);
dao.delete(entity);
assertEquals(0, dao.findAll().size());
}

// other tests for insert, update, ... follow

顺便说一下,DAO 实现总是以 sqliteOpenHelper.getWritableDatabase() 打开可写数据库。

最佳答案

这与 DbManager 和 DaoMaster 是单例(我想也是底层数据库)的事实有关:@Before 中的代码在每次测试之前被调用,这搞砸了可能应该只启动一次的类。

@Before注解改为@BeforeClass,以便只执行一次初始化。

关于Android 单元测试 - SQLiteReadOnlyDatabaseException : Attempt to write a readonly database (code 1032),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com