Java 尝试创建SQLiteDatabase时发生NullPointerException

Java 尝试创建SQLiteDatabase时发生NullPointerException,java,android,Java,Android,我正在尝试创建sqlite数据库,下面是我的代码。每次我尝试运行我的应用程序时,它都会给我发送很多错误。我认为这是模拟器的问题,但这是我的代码和错误。 我需要帮助。我不知道该怎么办 import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenH

我正在尝试创建sqlite数据库,下面是我的代码。每次我尝试运行我的应用程序时,它都会给我发送很多错误。我认为这是模拟器的问题,但这是我的代码和错误。 我需要帮助。我不知道该怎么办

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class saeedHelperBD extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "saeedDataBase";
private static final String TABLE_NAME = "saeedTable";
private static final int DATABASE_VERSION = 1;
private static final String UID = "_id";
private static final String NAME = "Name";
private static final String ADRESS = "Adress";
private static final String CREAT_TABLE ="CREATE TABLE " + TABLE_NAME + " (" + UID + "                INTEGER PRIMARY KEY AUTOINCREMENT , " + NAME + " VARCHAR(225));";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
private Context context;
public saeedHelperBD(Context con) {
    super(con, DATABASE_NAME, null  , DATABASE_VERSION);
    this.context=con;
    Message.message(context, "constructor called");
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        Message.message(context, "onCreate was called");
        db.execSQL(CREAT_TABLE);
    } catch (SQLException e) {
        Message.message(context, ""+e);
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
    db.execSQL(DROP_TABLE);
    try {
        Message.message(context, "onUpgrade was called");
        onCreate(db);
    } catch (SQLException e) {
        Message.message(context, ""+e);
    }
}

main()
}
saeedHelperBD firstBD;
SQLiteDatabase sqlBD = firstBD.
}`
比如说

01-17 14:52:39.890: D/AndroidRuntime(1699): Shutting down VM
01-17 14:52:39.890: W/dalvikvm(1699): threadid=1: thread exiting with uncaught exception (group=0xb3abdb90)
01-17 14:52:39.910: E/AndroidRuntime(1699): FATAL EXCEPTION: main
01-17 14:52:39.910: E/AndroidRuntime(1699): Process: com.example.net.saeed.sqlitedb, PID: 1699
01-17 14:52:39.910: E/AndroidRuntime(1699): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.net.saeed.sqlitedb/com.example.net.saeed.sqlitedb.MainActivity}: java.lang.NullPointerException
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.os.Looper.loop(Looper.java:137)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread.main(ActivityThread.java:4998)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at java.lang.reflect.Method.invokeNative(Native Method)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at java.lang.reflect.Method.invoke(Method.java:515)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at dalvik.system.NativeStart.main(Native Method)
01-17 14:52:39.910: E/AndroidRuntime(1699): Caused by: java.lang.NullPointerException
01-17 14:52:39.910: E/AndroidRuntime(1699):     at com.example.net.saeed.sqlitedb.MainActivity.onCreate(MainActivity.java:15)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.Activity.performCreate(Activity.java:5243)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-17 14:52:39.910: E/AndroidRuntime(1699):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
01-17 14:52:39.910: E/AndroidRuntime(1699):     ... 11 more
01-17 14:52:45.450: I/Process(1699): Sending signal. PID: 1699 SIG: 9
好的,这是主要活动

package com.example.net.saeed.sqlitedb;

import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;

public class MainActivity extends Activity {
saeedHelperBD firstBD;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

SQLiteDatabase sqlBD = firstBD.getWritableDatabase();

}

为了帮助解决您的问题,请在运行查询的部分周围添加try-catch。。 在catch中添加e.printStackTrace;它会给你更多更好的信息,告诉你问题出在哪里

下面是我使用的一些DB代码,它在VM中运行良好

package com.jinx.dbs;

import android.content.*;
import android.database.*;
import android.database.sqlite.*;
import android.util.*;
import com.jinx.obj.User;
import java.util.*;

public class database {

    private Context mContext;
    private SQLiteDatabase mainDB = null;
    private final String dbName = "mainDB";
    private final String tblUserDetail = "tblUser";

    public database(Context context) {
        mContext = context;
    }

    boolean CreateOrOpenDB() {
        try {
            mainDB = mContext.openOrCreateDatabase(dbName, SQLiteDatabase.CREATE_IF_NECESSARY, null);
            return true;
        } catch (SQLiteException e) {
            e.printStackTrace();
            mainDB.close();
            return false;
        }
    }

    void CreateUserTable() {
        mainDB.execSQL("CREATE TABLE IF NOT EXISTS "
                + tblUserDetail
                + " (Username VARCHAR(50),"
                + " Password VARCHAR(100),"
                + " Name VARCHAR(100),"
                + " Surname VARCHAR(100));");
    }

    public void StoreUserData(User user) {
        //Open DB before running any queries
        if (CreateOrOpenDB()) {
            try {
                //Make sure the table exists
                CreateUserTable();
                //Only store one users info at a time
                mainDB.execSQL("DELETE FROM " + tblUserDetail);
                mainDB.execSQL("INSERT INTO "
                        + tblUserDetail
                        + " Values ('"
                        + user.getUsername().replace("'", "''") + "','"
                        + user.getPassword().replace("'", "''") + "','"
                        + user.getName().replace("'", "''") + "','"
                        + user.getSurname().replace("'", "''") + "');");

                mainDB.close();
            } catch (Exception e) {
                e.printStackTrace();
                mainDB.close();
            }
        } else {
            Log.i("DATABASE", "COULD NOT BE OPENED");
        }
    }

    public User ReadUserData() {
        User data = null;
        if (CreateOrOpenDB()) {
            try {
                Cursor c = mainDB.rawQuery("SELECT * FROM "
                        + tblUserDetail, null);

                if (c != null) {
                    if (c.moveToFirst()) {
                        data = new User(
                                c.getString(c.getColumnIndex("Username")),
                                c.getString(c.getColumnIndex("Password")),
                                c.getString(c.getColumnIndex("Name")),
                                c.getString(c.getColumnIndex("Surname")));
                    }
                }
                c.close();

                mainDB.close();
            } catch (Exception e) {
                e.printStackTrace();
                mainDB.close();
            }
        } else {
            Log.i("DATABASE", "COULD NOT BE OPENED");
        }

        return data;
    }

    public void ClearUserData() {
        if (CreateOrOpenDB()) {
            try {
                mainDB.execSQL("DELETE FROM " + tblUserDetail);
                mainDB.close();
            } catch (Exception e) {
                e.printStackTrace();
                mainDB.close();
            }
        } else {
            Log.i("DATABASE", "COULD NOT BE OPENED");
        }
    }
}
您只需添加/更改以满足您的需求,添加更多表,加入它们,然后发疯。 按如下方式使用:

(new database(this)).StoreUserData(u); //Storing the new user -- u is User Object

User u = (new database(this)).ReadUserData(); //Get the user data

(new database(this)).ClearUserData(); //Clear the user data
编辑:

这是用户对象

package com.jinx.obj;
import java.io.Serializable;

public class User implements Serializable {
    private String _username;
    private String _password;
    private String _name;
    private String _surname;

    public User() {
    }
    public User(String Username, String Password, String Name, String Surname) {
        this._username = Username;
        this._password = Password;
        this._name = Name;
        this._surname = Surname;
    }
    public void setUsername(String Username) {
        this._username = Username;
    }
    public String getUsername() {
        return this._username;
    }
    public void setPassword(String Password) {
        this._password = Password;
    }
    public String getPassword() {
        return this._password;
    }
    public void setName(String Name) {
        this._name = Name;
    }
    public String getName() {
        return this._name;
    }    
    public void setSurname(String Surname) {
        this._surname = Surname;
    }
    public String getSurname() {
        return this._surname;
    }
}
谢谢各位, 我解决了这个问题,问题出现在MainActivity的第15行,我试图在SQLiteDatabase对象中放入null对象,所以我只是创建了一个新对象,然后我试图将该对象放入SQLiteDatabase,下面是固定的代码

package com.example.net.saeed.sqlitedb;

import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;

    public class MainActivity extends Activity {
saeedHelperBD firstBD;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    firstBD = new saeedHelperBD(this);//this was added to solve the problem
    SQLiteDatabase sql = firstBD.getWritableDatabase();

}

在代码中,您试图调用firstBD.getWritableDatabase;。但是,firstBD对象为null。您需要首先初始化此对象。 我更喜欢使用单例模式来初始化saeedheloperbd的对象

另外,您应该声明一个类名,最好使用大写字母first。
例如:saeedHelperBD是错误的,您可以声明为saeedHelperBD

您的问题在MainActivity.java的第15行。您显示了错误的代码。您的MainActivity在第15行有一个空指针异常,上面有什么?另外,您必须将问题更改为空指针异常或类似。非常感谢各位,是的,您是对的。问题出现在MainActivity的第15行,但我必须做的是MainActivity,这里是MainActivity错误出现在MainActivity类中,与OP发布的代码无关。
private static saeedHelperBD firstDB;
    public static synchronized saeedHelperBD getInstance() {
        if (firstDB == null) {
            firstDB = new saeedHelperBD(context);
        }
        return firstDB;
    }