Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
Java 使用SQLiteOpenHelper时ContextWrapper.openOrCreateDatabase中的NullPointerException_Java_Android_Sqliteopenhelper_Opendatabase - Fatal编程技术网

Java 使用SQLiteOpenHelper时ContextWrapper.openOrCreateDatabase中的NullPointerException

Java 使用SQLiteOpenHelper时ContextWrapper.openOrCreateDatabase中的NullPointerException,java,android,sqliteopenhelper,opendatabase,Java,Android,Sqliteopenhelper,Opendatabase,我正在制作一个使用数据库的新android应用程序。我使用了类似的代码来创建和复制数据库,但由于某些原因它无法工作。我想不出来,救命啊。 日志: 在LevelActivity.java上调用createDataBase()方法,并在第一次使用DataBaseHelper时获取错误 编辑:对我来说,getLastId看起来是空的,但它不应该是空的,所以访问数据库时出现问题。我看了文件浏览器,数据库在那里,里面的信息是正确的 删除open()方法 不要调用getReadableDatabase()和

我正在制作一个使用数据库的新android应用程序。我使用了类似的代码来创建和复制数据库,但由于某些原因它无法工作。我想不出来,救命啊。 日志:

在LevelActivity.java上调用createDataBase()方法,并在第一次使用DataBaseHelper时获取错误

编辑:对我来说,getLastId看起来是空的,但它不应该是空的,所以访问数据库时出现问题。我看了文件浏览器,数据库在那里,里面的信息是正确的

  • 删除
    open()
    方法

  • 不要调用
    getReadableDatabase()和/或
    getWritableDatabase()execSQL()
    query()
    insert()
    ,等等)。在其他地方使用这些方法,如
    dataBaseHelper.getReadableDatabase()
    dataBaseHelper.getWritableDatabase()

  • 删除
    DB_路径
    ,不要使用路径。您不需要提供路径,系统将从您的packages databases文件夹创建并读取数据库


  • 我发现了我的错误。我调用了一个函数,该函数在创建数据库之前从数据库获取数据。

    看起来DatabaseHelper可能是用空上下文构造的。
    07-03 21:38:54.260: E/AndroidRuntime(12172): FATAL EXCEPTION: main
    07-03 21:38:54.260: E/AndroidRuntime(12172): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{lv.revopeng.guessthelocation/lv.revopeng.guessthelocation.LevelActivity}: java.lang.NullPointerException
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.os.Handler.dispatchMessage(Handler.java:99)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.os.Looper.loop(Looper.java:123)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at java.lang.reflect.Method.invokeNative(Native Method)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at java.lang.reflect.Method.invoke(Method.java:521)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at dalvik.system.NativeStart.main(Native Method)
    07-03 21:38:54.260: E/AndroidRuntime(12172): Caused by: java.lang.NullPointerException
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:112)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at lv.revopeng.guessthelocation.DataBaseHelper.open(DataBaseHelper.java:114)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at lv.revopeng.guessthelocation.DataBaseHelper.getLastId(DataBaseHelper.java:128)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at lv.revopeng.guessthelocation.LevelActivity.<init>(LevelActivity.java:31)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at java.lang.Class.newInstanceImpl(Native Method)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at java.lang.Class.newInstance(Class.java:1429)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
    07-03 21:38:54.260: E/AndroidRuntime(12172):    ... 11 more
    
    public class DataBaseHelper extends SQLiteOpenHelper {
    
        // The Android's default system path of your application database.
        private static String DB_PATH = "/data/data/lv.revopeng.guessthelocation/databases/";
        private static String DB_NAME = "GuessTheLocationTest.db";
        public static final String TABLE_NAME1 = "gtl_levels";
    
        public static final String WHATTODONOW_COLUMN_ID = "_id";
        public static final String WHATTODONOW_COLUMN_INFO = "levelInfo";
        public static final String WHATTODONOW_COLUMN_ANSWER = "levelAnswer";
        public static final String WHATTODONOW_COLUMN_IMAGE = "levelImage";
        public static final String WHATTODONOW_COLUMN_CLEARED = "levelCleared";
        private DataBaseHelper openHelper;
        private SQLiteDatabase myDataBase;
        private final Context myContext;
    
        public DataBaseHelper(Context context) {
            super(context, DB_NAME, null, 1);
            this.myContext = context;
        }
    
        public void createDataBase() throws IOException {
            boolean dbExist = checkDataBase();
            if (dbExist) {
            } else {
                this.getReadableDatabase();
                try {
                    copyDataBase();
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
            }
        }
    
        private boolean checkDataBase() {
    
            SQLiteDatabase checkDB = null;
    
            try {
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null,
                        SQLiteDatabase.OPEN_READONLY);
    
            } catch (SQLiteException e) {
            }
            if (checkDB != null) {
                checkDB.close();
            }
            return checkDB != null ? true : false;
        }
    
        private void copyDataBase() throws IOException {
    
            InputStream myInput = myContext.getAssets().open(DB_NAME);
    
            String outFileName = DB_PATH + DB_NAME;
    
            OutputStream myOutput = new FileOutputStream(outFileName);
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
    
            myOutput.flush();
            myOutput.close();
            myInput.close();
    
        }
    
        public void openDataBase() throws SQLException {
    
            // Open the database
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);
        }
    
        @Override
        public synchronized void close() {
            if (myDataBase != null)
                myDataBase.close();
            super.close();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase myDataBase, int oldVersion,
                int newVersion) {
        }
    
        public DataBaseHelper open() throws SQLException {
            openHelper = new DataBaseHelper(myContext);
            myDataBase = openHelper.getWritableDatabase();
            return this;
        }
    
        public void closee() {
            openHelper.close();
        }
    
        String[] columns = new String[] { WHATTODONOW_COLUMN_ID,
                WHATTODONOW_COLUMN_INFO, WHATTODONOW_COLUMN_ANSWER,
                WHATTODONOW_COLUMN_IMAGE, WHATTODONOW_COLUMN_CLEARED };
    
        public int getLastId() {
            int id = 0;
            open();
            final String MY_QUERY = "SELECT MAX(_id) AS _id FROM " + TABLE_NAME1;
            Cursor mCursor = myDataBase.rawQuery(MY_QUERY, null);
            try {
                if (mCursor.getCount() > 0) {
                    mCursor.moveToFirst();
                    id = mCursor.getInt(0);
                    mCursor.close();
                    close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
            }
            return id;
    
        }