有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用SQLite数据库修复NullPointerException

我对Android编程的Java编程还不熟悉。我正在创建一个显示我从数据库创建的ArrayList的活动

该数组在我的主活动中运行良好,但当我尝试在另一个活动中显示和调用该方法时,它会显示以下消息:

java.lang.RuntimeException: Unable to start activity >ComponentInfo{com.example.carlos.application1/com.example.carlos.application1.ema>il}: java.lang.NullPointerException: Attempt to invoke virtual method >'java.util.ArrayList com.example.carlos.application1.DBHelper.getAllCotacts()' on >a null object reference

这里发生了什么?为什么会有NullPointerException?我必须初始化吗

活动:

import 安卓.app.Activity;
import 安卓.content.ActivityNotFoundException;
import 安卓.content.Intent;
import 安卓.os.Bundle;
import 安卓.os.PersistableBundle;
import 安卓.view.View;
import 安卓.widget.AdapterView;
import 安卓.widget.Button;
import 安卓.widget.ListView;
import 安卓.widget.Toast;
import 安卓.widget.ArrayAdapter;
import java.util.ArrayList;

/**
 * Created by Carlos on 16/05/2016.
 */
public class email extends Activity {

    private Button send;
    DBHelper mydb1;
    private ListView obj;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.email_display);
        ArrayList array_list = mydb1.getAllCotacts();
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, 安卓.R.layout.simple_list_item_1, array_list);
        //ArrayAdapter arrayAdapter = new ArrayAdapter(this, 安卓.R.layout.simple_list_item_1, array_list);
        //obj = (ListView) findViewById(R.id.listView1);
        //obj.setAdapter(arrayAdapter);

        send = (Button) findViewById(R.id.send_button);

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Intent emailIntent = new Intent(Intent.ACTION_SEND);
                    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {
                        "example@gmail.com"
                    });
                    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                    emailIntent.putExtra(Intent.EXTRA_TEXT, "HEY");
                    emailIntent.putExtra(Intent.EXTRA_CC, "example@gmail.com");
                    emailIntent.setType("message/rfc822");
                    startActivity(emailIntent);
                } catch (ActivityNotFoundException anfe) {
                    Toast toast = Toast.makeText(email.this, "Sorry, no email client found", Toast.LENGTH_LONG);
                    toast.show();
                }
            }
        });
    }
}

数据库处理程序

package com.example.carlos.application1;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import 安卓.content.ContentValues;
import 安卓.content.Context;
import 安卓.database.Cursor;
import 安卓.database.DatabaseUtils;
import 安卓.database.sqlite.SQLiteOpenHelper;
import 安卓.database.sqlite.SQLiteDatabase;

public class DBHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "MyDBName.db";
    public static final String CONT_TABLE_NAME = "tablename";
    public static final String CONT_COLUMN_ID = "id";
    public static final String CONT_COLUMN_CONDUCTIVITY = "conductivity";
    public static final String CONT_COLUMN_MOISTURE = "moisture";
    public static final String CONT_COLUMN_OXYGEN = "oxygen";
    public static final String CONT_COLUMN_PH = "ph";

    private HashMap hp;

    public DBHelper(Context context)
    {
        super(context, DATABASE_NAME , null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(
                "create table tablename " +
                        "(id integer primary key, conductivity text,ph text,oxygen text, moisture text)"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS tablename");
        onCreate(db);
    }

    public boolean insertContact  (String conductivity, String ph, String oxygen, String moisture)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("conductivity", conductivity);
        contentValues.put("ph", ph);
        contentValues.put("oxygen", oxygen);
        contentValues.put("moisture", moisture);

        db.insert("tablename", null, contentValues);
        return true;
    }

    public Cursor getData(int id){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  db.rawQuery( "select * from tablename where id="+id+"", null );
        return res;
    }

    public int numberOfRows(){
        SQLiteDatabase db = this.getReadableDatabase();
        int numRows = (int) DatabaseUtils.queryNumEntries(db, CONT_TABLE_NAME);
        return numRows;
    }

    public boolean updateContact (Integer id, String conductivity, String ph, String oxygen, String moisture)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("conductivity", conductivity);
        contentValues.put("ph", ph);
        contentValues.put("oxygen", oxygen);
        contentValues.put("moisture", moisture);

        db.update("tablename", contentValues, "id = ? ", new String[] { Integer.toString(id) } );
        return true;
    }

    public Integer deleteContact (Integer id)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.delete("tablename",
                "id = ? ",
                new String[] { Integer.toString(id) });
    }

    public ArrayList<String> getAllCotacts()
    {
        ArrayList<String> array_list = new ArrayList<String>();

        //hp = new HashMap();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  db.rawQuery( "select * from tablename", null );
        res.moveToFirst();

        while(res.isAfterLast() == false){
            array_list.add(res.getString(res.getColumnIndex(CONT_COLUMN_CONDUCTIVITY)));
            res.moveToNext();
        }
        return array_list;
    }
}

共 (3) 个答案

  1. # 1 楼答案

    看起来您正在尝试对尚未实例化的对象调用方法。在你这么做之前

    ArrayList array_list = mydb1.getAllCotacts();
    

    。。。在onCreate方法中的某处添加一行如下内容:

    mydb1 = new DBHelper(this);
    

    在实际创建DBHelper之前,不能对其调用方法。这就是消息试图调用虚拟方法DBHelper的原因。对空对象引用的getAllCotacts()表示

  2. # 2 楼答案

    您忘记初始化它:(如下所示:

    mydb1 = new DBHelper(this);
    

    然后从中调用get方法

    ArrayList array_list = mydb1.getAllCotacts();
    
  3. # 3 楼答案

    您需要初始化mydb1。 mydb1 = new DBHelper(mycontext);