【问题标题】:NullPointerException while inserting data into SqliteDatabase Android将数据插入 SqliteDatabase Android 时出现 NullPointerException
【发布时间】:2012-12-21 08:06:18
【问题描述】:

Android 2.3.3

static String name = "Database";
static int version = 1;

static SQLiteDatabase sqlDB;
static Cursor c;


public Database(Context context) {
    super(context, name, null, version);
    // TODO Auto-generated constructor stub

    sqlDB = getWritableDatabase();

    }

    @Override
    public void onCreate(SQLiteDatabase sqlDB) {
        // TODO Auto-generated method stub


    sqlDB.execSQL("create table if not exists Operations(Command Text, Pos1 Text, " +
                "Pos2 Text, Pos3 Text, Pos4 Text, Pos5 Text, Pos6 Text, Pos7 Text, Pos8 Text, Pos9 Text, Pos10 Text)");

        insertData();
    }

private void insertData() {
        // TODO Auto-generated method stub

        String addQuery ="ADD, add, and, had, ad, anddd, anndd, null, null, null, null";

                sqlDB.execSQL("insert into Operations values("+ addQuery +")"); 
                     //Exception at the above line
}

共有 11 列。

我可以在数据库中插入 NULL 吗? 如果是,我尝试将数据插入数据库的方式有什么问题吗?

正如 rekire 所指出的,问题似乎出在 getWritableDatabase() 上。我正在调用构造函数,Database db = new Database(this);到目前为止,它在所有其他项目中都有效,因为我已经声明了名称和版本的局部变量,并向工厂提供了 null。

Answer ::: 对不起,这是我的错误。我在数据库中调用了一个方法, 通过使用 Database.method(),而不是它的 object(db)。这使得 SQLiteDatabase 和 Cursor 对象在 Database.java 中是静态的 文件。当我将其更改为 db.method(),并删除了静态 关键字,效果很好。

感谢您的宝贵时间.. 麻烦您了。

【问题讨论】:

  • 你检查数据库是否创建了吗?

标签: android


【解决方案1】:

如果我猜对了,你的函数 getWritableDatabase() 返回 null。

【讨论】:

  • 在您显示的代码中唯一可以为空的对象是sqlDB,这个对象是由函数getWritableDatabase() 设置的。有点奇怪,您的 onCreate 没有抛出任何错误。
  • 是的,onCreate 没有显示任何错误,并且可以正确编译。我在运行时收到错误。
  • 尝试在onCreate 的末尾添加Log.d("~~test~~", "(sqlDB==null)="+(sqlDB==null)); 并告诉我logcat 中的结果是什么。
  • @VamsiChalla : 在执行 SQL 插入命令之前,将 sqlDB = getWritableDatabase(); 这一行从构造函数中取出并放入 insertData() 方法中。
  • 稍等...brb..我回来后会回复
【解决方案2】:

在进行查询之前,您需要调用 open() 方法

mDbHelper.open(); //whitout this call mdb will be NULL

【讨论】:

    【解决方案3】:
    private void insertData() {
        if(sqlDB == null) sqlDB.open();
        String addQuery ="ADD, add, and, had, ad, anddd, anndd, null, null, null, null";
        sqlDB.execSQL("insert into Operations values("+ addQuery +")");
    }
    

    【讨论】:

      【解决方案4】:

      在你的

       public void onCreate(SQLiteDatabase sqlDB)
      

      你应该分配sqlDB = sqlDB; 然后你可以在 insertData() 中使用 sqlDB

      【讨论】:

      • 一般来说,我不会使用与全局和局部变量相同的名称...从您的编码来看,我只是认为 onCreate 中的 sqlDB 是您所需要的。我也同意其他人的观点,即 getWritableDatabase 返回 null。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多