【问题标题】:Android: Attempt to invoke virtual method 'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' on a null object reference [duplicate]Android:尝试在空对象引用上调用虚拟方法“void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)”[重复]
【发布时间】:2018-06-05 03:23:10
【问题描述】:

我收到此错误:

无法开始活动 组件信息{amsi.dei.estg.ipleiria.pt.ima/amsi.dei.estg.ipleiria.pt.ima.ListaEmpresas}: java.lang.NullPointerException:尝试调用虚拟方法'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' 在一个 空对象引用”在我的 DBHelper 中的这一行:

错误在这一行:

database.execSQL(createEmpresasTable);

我的 DBHelper:

public class ImaBDHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "IMA";
private static final int DB_VERSION = 1;

private static final String EMPRESAS_TABLE_NAME = "empresas";
private static final String NOME_EMPRESA = "nome";
private static final String DESCRICAO_EMPRESA = "descricao";
private static final String LOCALIDADE_EMPRESA = "localidade";
private static final String AREA_EMPRESA = "area";

private final SQLiteDatabase database;

public ImaBDHelper(Context context)
{
    super(context, DB_NAME, null, DB_VERSION);

    this.database = getWritableDatabase();
}


@Override
public void onCreate(SQLiteDatabase db) {
    String createEmpresasTable = "CREATE TABLE " + EMPRESAS_TABLE_NAME +
            "(id INTENGER PRIMARY KEY AUTOINCREMENT," +
            NOME_EMPRESA + " TEXT NOT NULL," +
            DESCRICAO_EMPRESA + " TEXT," +
            LOCALIDADE_EMPRESA + " TEXT NOT NULL," +
            AREA_EMPRESA + " TEXT NOT NULL," + ")";
database.execSQL(createEmpresasTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String sql = "DROP TABLE IF EXISTS " + EMPRESAS_TABLE_NAME;
    database.execSQL(sql);
    this.onCreate(database);
}

其余的只是创建、读取、更新和删除的方法。

对不起,如果这是重复的,但我在搜索中没有找到这个确切问题的答案。提前谢谢!

【问题讨论】:

  • 使用onCreate(SQLiteDatabase db) 签名中的db 对象,而不是您定义为字段的databaseonUpgrade() 方法的实现也是如此......
  • 谢谢!!不知道我怎么没注意到
  • 试试这个 - 检查你的数据库文件夹名称和正确的 db 文件格式名称,不要在 SQLite 的 DB Browser 中复制粘贴数据库文件

标签: java android sqlite nullpointerexception


【解决方案1】:

使用onCreate(SQLiteDatabase db) 签名值代替private final SQLiteDatabase database; 执行如下查询

@Override
public void onCreate(SQLiteDatabase db) {
    String createEmpresasTable = "CREATE TABLE " + EMPRESAS_TABLE_NAME +
            "(id INTENGER PRIMARY KEY AUTOINCREMENT," +
            NOME_EMPRESA + " TEXT NOT NULL," +
            DESCRICAO_EMPRESA + " TEXT," +
            LOCALIDADE_EMPRESA + " TEXT NOT NULL," +
            AREA_EMPRESA + " TEXT NOT NULL," + ")";
db.execSQL(createEmpresasTable);// change here
}

这样也可以在你的 onUpgrade() 中使用

【讨论】:

  • 这对我不起作用,但我的问题解决了。试试这个 - 检查你的数据库文件夹名称和正确的文件格式名称在 db 中,不要在 DB Browser for SQLite 中复制粘贴数据库文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2021-12-29
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多