Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java SQLite NullPointerException_Java_Android_Sqlite - Fatal编程技术网

Android Java SQLite NullPointerException

Android Java SQLite NullPointerException,java,android,sqlite,Java,Android,Sqlite,我在尝试获取SQLite数据库并执行SQL语句时遇到了一些问题 DatabaseAdapter.java protected static final String TAG = "DatabaseAdapter"; private final Context mContext; private SQLiteDatabase mDb; private DataBaseHelper mDbHelper; public DatabaseAdapter(Context context) { t

我在尝试获取SQLite数据库并执行SQL语句时遇到了一些问题

DatabaseAdapter.java

protected static final String TAG = "DatabaseAdapter";
private final Context mContext;
private SQLiteDatabase mDb;
private DataBaseHelper mDbHelper;

public DatabaseAdapter(Context context) {
    this.mContext = context;
    mDbHelper = new DataBaseHelper(mContext);
}

public DatabaseAdapter createDatabase() throws SQLException {
    try {
        mDbHelper.createDataBase();
        Log.e(TAG, "Database Created");
    } catch (IOException mIOException) {
        Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
        throw new Error("UnableToCreateDatabase");
    }
    return this;
}

public SQLiteDatabase open() throws SQLException {
    try {
        mDbHelper.openDataBase();
        mDbHelper.close();
        mDb = mDbHelper.getReadableDatabase();
        Log.e(TAG, "Database Open");
    } catch (SQLException mSQLException) {
        Log.e(TAG, "open >>" + mSQLException.toString());
        throw mSQLException;
    }
    return mDb;
}

public void close() {
    mDbHelper.close();
}
DatabaseHelper.java

private static String TAG = "DataBaseHelper"; // Tag just for the LogCat
                                                // window
// destination path (location) of our database on device
private static String DB_PATH = "";
private static String DB_NAME = "schoolAssignment";// Database name
private SQLiteDatabase mDataBase;
private final Context mContext;

public DataBaseHelper(Context context) {
    super(context, DB_NAME, null, 1);// 1? its Database Version
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.mContext = context;
}

public void createDataBase() throws IOException {
    // If database not exists copy it from the assets
    Log.e(TAG, "CreateDataBase()");
    boolean mDataBaseExist = checkDataBase();
    if (!mDataBaseExist) {
        this.getReadableDatabase();
        this.close();
        try {
            // Copy the database from assests
            copyDataBase();
            Log.e(TAG, "createDatabase database created");
        } catch (IOException mIOException) {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}

// Check that the database exists here: /data/data/your package/databases/Database
// Name
private boolean checkDataBase() {
    File dbFile = new File(DB_PATH + DB_NAME);
    Log.e("dbFile", dbFile + "   "+ dbFile.exists());
    return dbFile.exists();
}

// Copy the database from assets
private void copyDataBase() throws IOException {
    InputStream mInput = mContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_NAME;
    OutputStream mOutput = new FileOutputStream(outFileName);
    byte[] mBuffer = new byte[1024];
    int mLength;
    while ((mLength = mInput.read(mBuffer)) > 0) {
        mOutput.write(mBuffer, 0, mLength);
    }
    mOutput.flush();
    mOutput.close();
    mInput.close();
}

// Open the database, so we can query it
public boolean openDataBase() throws SQLException {
    String mPath = DB_PATH + DB_NAME;
    // Log.v("mPath", mPath);
    mDataBase = SQLiteDatabase.openDatabase(mPath, null,
            SQLiteDatabase.CREATE_IF_NECESSARY);
    // mDataBase = SQLiteDatabase.openDatabase(mPath, null,
    // SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    return mDataBase != null;
}

@Override
public synchronized void close() {
    if (mDataBase != null)
        mDataBase.close();
    super.close();
}

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

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}
Exercise.java

TableLayout table_layout;

private SQLiteDatabase mDb;

public Exercise(){
    this.mDb =  new DataBaseHelper(this).getReadableDatabase();  
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabhost);       
    table_layout = (TableLayout) findViewById(R.id.TableLayout);
    BuildTable();
}

private void BuildTable() {
    try {
        String sql = "SELECT * FROM exercise";
        Cursor mCur = mDb.rawQuery(sql, null);
        if (mCur.getCount() != 0) {
            if (mCur.moveToFirst()) {
                do {
                    int rows = mCur.getCount();
                    int cols = mCur.getColumnCount();
                    // outer for loop
                    for (int i = 0; i < rows; i++) {

                        TableRow row = new TableRow(this);
                        row.setLayoutParams(new LayoutParams(
                                LayoutParams.MATCH_PARENT,
                                LayoutParams.WRAP_CONTENT));

                        // inner for loop
                        for (int j = 0; j < cols; j++) {

                            TextView tv = new TextView(this);
                            tv.setLayoutParams(new LayoutParams(
                                    LayoutParams.WRAP_CONTENT,
                                    LayoutParams.WRAP_CONTENT));
                            tv.setGravity(Gravity.CENTER);
                            tv.setTextSize(18);
                            tv.setPadding(0, 5, 0, 5);

                            tv.setText(mCur.getString(j));
                            row.addView(tv);

                        }
                        table_layout.addView(row);
                    }
                } while (mCur.moveToNext());
            }
        }
    } catch (SQLException mSQLException) {
        throw mSQLException;
    }
以下是错误消息,作为我的日志:

07-30 09:00:04.251: E/AndroidRuntime(16151): FATAL EXCEPTION: main
07-30 09:00:04.251: E/AndroidRuntime(16151): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{edu.nyp.project/edu.nyp.project.Exercise}: java.lang.NullPointerException
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1894)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.os.Looper.loop(Looper.java:137)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread.main(ActivityThread.java:4512)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at java.lang.reflect.Method.invokeNative(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at java.lang.reflect.Method.invoke(Method.java:511)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at dalvik.system.NativeStart.main(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151): Caused by: java.lang.NullPointerException
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:228)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at edu.nyp.project.Exercise.<init>(Exercise.java:29)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at java.lang.Class.newInstanceImpl(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at java.lang.Class.newInstance(Class.java:1319)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.Instrumentation.newActivity(Instrumentation.java:1026)
07-30 09:00:04.251: E/AndroidRuntime(16151):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1885)
07-30 09:00:04.251: E/AndroidRuntime(16151):    ... 11 more
问题在于Exercise类中的空构造函数。当我移除它时,它运行得非常好。我不知道它为什么会这样。有导游吗

提前谢谢

你做不到

this.mDb =  new DataBaseHelper(this).getReadableDatabase();  
在构造函数中,因为活动上下文不存在。该行必须位于onCreate、onResume或onStart方法中

@凌驾

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabhost);       
    this.mDb =  new DataBaseHelper(this).getReadableDatabase();  ///This Line
    table_layout = (TableLayout) findViewById(R.id.TableLayout);
    BuildTable();
}

请不要为您的活动创建任何构造函数。将任何初始化放在onCreate中。获取null的原因是上下文仍然为null。相关:@AndrewT您对如何将其应用到我的问题中有什么想法吗?您使用的是现有的SQLite数据库文件吗?目前,正如错误所说,数据库中没有练习表,我假设发生了错误,数据库为空。我从SQLite browser创建了一个数据库,并将其放入项目的assets文件夹中。我这样做对吗?如果我将行移到onCreate中,它会抛出空指针异常错误。@20美分,我会将它移到onCreate中,然后再次检查错误。也许错误是由不同的来源造成的。相同的NullPointerException,但源不同。@AndrewT。我已经删除了Exercise类中的两个构造函数,并将代码修改为您提供的代码。现在,错误消息在已编辑部分中显示为LogCat。你能帮我看看吗?