【问题标题】:SQLite getwritableDatabase returns nullSQLite getwritableDatabase 返回 null
【发布时间】:2018-07-12 14:22:18
【问题描述】:

在尝试为我正在处理的项目开发一些单元测试时,我遇到了需要测试 DB 行为的墙。 我正在尝试创建一个内存数据库(SQLite)

虽然我认为这个相当基本的测试会按照要求进行,但它总是返回一个 NULL 数据库,这不是我所期望的。

package be.wgkovl.evdt.Util;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.test.mock.MockContext;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith( PowerMockRunner.class )
public class ClassForStack {


    SQLiteDatabase db;
    Context context;

    private Cursor test() {
        if (db != null) {
            return db.rawQuery("Select * from myTable", new String[]{});
        } else {
            System.out.println("Db is null :-(");
        }
        return null;
    }

    private String[] emtpyArgument = new String[]{};


    @Before
    public void setup() {
        System.out.println("Setting up");
        context = new MockContext();

        SQLiteOpenHelper dummy = new SQLiteOpenHelper(context, "SomeName.memory", null, 1) {
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
            }
        };


        String basicInitQuery = "CREATE TABLE IF NOT EXISTS myTable(id INTEGER PRIMARY KEY DESC, value TEXT)";
        String basicInsertQuery = "INSERT INTO myTable(id, value) VALUES (1,?)";
        db = dummy.getWritableDatabase();

    }

    @Test
    public void baseDbTest() {
        Cursor c = test();
        if (c != null) {
            System.out.println(c.getColumnNames());
            System.out.println(c.getColumnCount());
            System.out.println("Starting test");
        }
    }
}

我在 Stackoverflow 上查看了几种不同的解决方案,但似乎没有一个能够为我指出正确的解决方案。它们在此处列出

getWritableDatabase returns null
Android Sqlite always null even after calling getWritableDatabase()
Create SQLite database in android
SQLite getReadableDatabase() returns NULL
SQLiteOpenHelper failing to call onCreate?

我做错了什么,我得到一个空数据库,但没有任何类型的错误或异常?

【问题讨论】:

  • 确认一下,这是在/androidTest中定义的连接测试吗?
  • 连接测试是什么意思?它目前位于我结构中的指定测试文件夹中。
  • src/ - src/test 下有两个测试文件夹,其中包含 run on your local machine 的 JUnit 测试和运行单元测试 on a connected Android devicesrc/androidTest。您不能在 src/test 文件夹中使用特定于 Android 的类(在您的情况下为 CursorContextSQLiteOpenHelper)。我怀疑这就是你得到null 作为回报的原因。
  • 它应该能够在本地运行这些测试。如果不用于本地测试,mockContext 有什么用?
  • 但是你的整个测试都依赖于SQLiteOpenHelper,不是吗?

标签: android sqlite


【解决方案1】:

您是否忘记在 onCreate() 中创建表?

  db.execSQL(basicInitQuery);

【讨论】:

  • 据我所知,onCreate() 没有被触发。在任何情况下它都不会显示我的日志记录..
  • 要如何创建表?
  • 在稍后调用的函数中。如果您需要在 onCreate 中定义整个数据库,如果您在那里什么都不做,它应该给出一个异常,而不是一个空数据库对象。
  • 我试过了,是的,它似乎没有用。既然我现在在家,那就等明天再试吧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
相关资源
最近更新 更多