Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 无法打开数据库Sqlite文件_Android_Sqlite_Android Assets - Fatal编程技术网

Android 无法打开数据库Sqlite文件

Android 无法打开数据库Sqlite文件,android,sqlite,android-assets,Android,Sqlite,Android Assets,关于这个问题我发现了很多问题,但我无法解决。我在资产文件夹中有一个sqlite数据库: assets/data/data/{package_name}/databases/dbtest.sqlite 我试图: 卸载项目 清理项目 刷新并重新启动eClipse 我查了一下我的包裹名 我检查了我的数据库文件名 但是我不能解决它。我不知道我错在哪里 提前谢谢 DBHelper.java public class DBHelper extends SQLiteOpenHelper { pri

关于这个问题我发现了很多问题,但我无法解决。我在资产文件夹中有一个sqlite数据库:

assets/data/data/{package_name}/databases/dbtest.sqlite
我试图:

  • 卸载项目
  • 清理项目
  • 刷新并重新启动eClipse
  • 我查了一下我的包裹名
  • 我检查了我的数据库文件名
  • 但是我不能解决它。我不知道我错在哪里

    提前谢谢

    DBHelper.java

    public class DBHelper extends SQLiteOpenHelper {
    
        private static String DB_PATH = "/data/data/com.exasmple.dbexam/databases/";
        private static String DB_NAME = "dbtest.sqlite";
        public static final String APP_TABLE = "land";
    
        private static final int DATABASE_VER5ION = 1;
        private static final String TYPE = "type";
        private static final String ID = "id";
    
        private SQLiteDatabase myDataBase;
        private final Context myContext;
        public static String state;
    
        public DBHelper(Context context) {
            super(context, DB_NAME, null, DATABASE_VER5ION);
            this.myContext = context;
        }
    
        public void createDataBase() throws IOException {
            // System.out.println("Creating database");
            boolean dbExist = checkDataBase();
            if (!dbExist) {
                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();
            System.out.println("Database copied into system data");
    
        }
    
        public void openDataBase() throws SQLException {
    
            System.out.println("Open database");
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);// SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    
        }
    
        @Override
        public synchronized void close() {
            if (myDataBase != null)
                myDataBase.close();
            super.close();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
            db.execSQL("DROP TABLE IF EXISTS report");
            db.execSQL("DROP TABLE IF EXISTS appstatus");
            onCreate(db);
        }
    
        public ArrayList<String> GetGroupName() {
            String sql = "";
            // System.out.println("Inside Database");
            sql = "select chapterid from content";
    
            ArrayList<String> list = new ArrayList<String>();
    
            Cursor cursor = myDataBase.rawQuery(sql, null);
    
            try {
                if (cursor != null) {
                    if (cursor.moveToFirst()) {
                        do {
                            list.add(cursor.getString(0));
                            System.out.println("dblist value==" + list);
                        } while (cursor.moveToNext());
                    }
                    if (cursor != null && !cursor.isClosed()) {
                        cursor.close();
                    }
                } else
                    Toast.makeText(myContext, "No values in DB", Toast.LENGTH_SHORT)
                            .show();
            } catch (Exception e) {
                System.out.println("GetGradeNames(): " + e);
            }
            return list;
        }
    
    }
    
    public类DBHelper扩展了SQLiteOpenHelper{
    私有静态字符串DB_PATH=“/data/data/com.exasmple.dbexam/databases/”;
    私有静态字符串DB_NAME=“dbtest.sqlite”;
    公共静态最终字符串APP_TABLE=“land”;
    私有静态最终int数据库版本=1;
    私有静态最终字符串TYPE=“TYPE”;
    私有静态最终字符串ID=“ID”;
    私有SQLiteDatabase-myDataBase;
    私有最终上下文myContext;
    公共静态字符串状态;
    公共DBHelper(上下文){
    super(上下文、数据库名称、null、数据库版本);
    this.myContext=上下文;
    }
    public void createDataBase()引发IOException{
    //System.out.println(“创建数据库”);
    布尔值dbExist=checkDataBase();
    如果(!dbExist){
    这是.getReadableDatabase();
    试一试{
    copyDataBase();
    }捕获(IOE异常){
    抛出新错误(“复制数据库时出错”);
    }
    }
    }
    私有布尔校验数据库(){
    SQLiteDatabase checkDB=null;
    试一试{
    字符串myPath=DB_PATH+DB_NAME;
    checkDB=SQLiteDatabase.openDatabase(myPath,null,
    SQLiteDatabase.OPEN_READONLY);
    }catch(sqlitee异常){
    }
    if(checkDB!=null){
    checkDB.close();
    }
    return checkDB!=null?true:false;
    }
    私有void copyDataBase()引发IOException{
    InputStream myInput=myContext.getAssets().open(DB_NAME);
    字符串outFileName=DB_路径+DB_名称;
    OutputStream myOutput=新文件OutputStream(outFileName);
    字节[]缓冲区=新字节[1024];
    整数长度;
    而((长度=myInput.read(缓冲区))>0){
    写入(缓冲区,0,长度);
    }
    myOutput.flush();
    myOutput.close();
    myInput.close();
    System.out.println(“复制到系统数据中的数据库”);
    }
    public void openDataBase()引发SQLException{
    System.out.println(“开放数据库”);
    字符串myPath=DB_PATH+DB_NAME;
    myDataBase=SQLiteDatabase.openDatabase(myPath,null,
    SQLiteDatabase.OPEN_READWRITE);//SQLiteDatabase.NO_本地化的_COLLATORS);
    }
    @凌驾
    公共同步作废关闭(){
    if(myDataBase!=null)
    myDataBase.close();
    super.close();
    }
    @凌驾
    public void onCreate(SQLiteDatabase db){
    }
    @凌驾
    public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
    db.execSQL(“如果存在删除表报告”);
    db.execSQL(“如果存在,则删除表appstatus”);
    onCreate(db);
    }
    公共ArrayList GetGroupName(){
    字符串sql=“”;
    //System.out.println(“内部数据库”);
    sql=“从内容中选择章节ID”;
    ArrayList=新建ArrayList();
    Cursor=myDataBase.rawQuery(sql,null);
    试一试{
    如果(光标!=null){
    if(cursor.moveToFirst()){
    做{
    list.add(cursor.getString(0));
    System.out.println(“dblist值=”+list);
    }while(cursor.moveToNext());
    }
    if(cursor!=null&!cursor.isClosed()){
    cursor.close();
    }
    }否则
    Toast.makeText(myContext,“数据库中无值”,Toast.LENGTH\u SHORT)
    .show();
    }捕获(例外e){
    System.out.println(“GetGradeNames():”+e);
    }
    退货清单;
    }
    }
    
    Logcat:

    07-09 14:57:27.834: E/AndroidRuntime(987): FATAL EXCEPTION: main
    07-09 14:57:27.834: E/AndroidRuntime(987): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exasmple.dbexam/com.exasmple.dbexam.MainActivity}: android.database.sqlite.SQLiteException: unable to open database file
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.os.Handler.dispatchMessage(Handler.java:99)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.os.Looper.loop(Looper.java:130)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at java.lang.reflect.Method.invokeNative(Native Method)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at java.lang.reflect.Method.invoke(Method.java:507)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at dalvik.system.NativeStart.main(Native Method)
    07-09 14:57:27.834: E/AndroidRuntime(987): Caused by: android.database.sqlite.SQLiteException: unable to open database file
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at com.exasmple.dbexam.DBHelper.openDataBase(DBHelper.java:138)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at com.exasmple.dbexam.MainActivity.onCreate(MainActivity.java:21)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    07-09 14:57:27.834: E/AndroidRuntime(987):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    07-09 14:57:27.834: E/AndroidRuntime(987):  ... 11 more
    
    07-09 14:57:27.834:E/AndroidRuntime(987):致命异常:main
    07-09 14:57:27.834:E/AndroidRuntime(987):java.lang.RuntimeException:无法启动活动组件信息{com.exasmple.dbexam/com.exasmple.dbexam.MainActivity}:android.database.sqlite.SQLiteException:无法打开数据库文件
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.access$1500(ActivityThread.java:117)
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.os.Handler.dispatchMessage(Handler.java:99)上
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.os.Looper.loop(Looper.java:130)上
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.main(ActivityThread.java:3683)上
    07-09 14:57:27.834:E/AndroidRuntime(987):位于java.lang.reflect.Method.Invokenactive(本机方法)
    07-09 14:57:27.834:E/AndroidRuntime(987):位于java.lang.reflect.Method.invoke(Method.java:507)
    07-09 14:57:27.834:E/AndroidRuntime(987):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-09 14:57:27.834:E/AndroidRuntime(987):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-09 14:57:27.834:E/AndroidRuntime(987):在dalvik.system.NativeStart.main(本机方法)
    07-09 14:57:27.834:E/AndroidRuntime(987):原因:android.database.sqlite.sqlite异常:无法打开数据库文件
    07-09 14:57:27.834:E/AndroidRuntime(987):在android.database.sqlite.SQLiteDatabase.dbopen(原生的M
    
    DB_NAME="dbtest";
    
    DB_PATH = "/data/data/com.exasmple.dbexam/databases/";
    
     public void createDataBase() throws IOException {
                // System.out.println("Creating database");
                boolean dbExist = checkDataBase();
                if (dbExist == true) {
                    this.getReadableDatabase();
    
                try {
                      this.openDataBase();
                } catch (SQLException e) {
    
                  e.printStackTrace();
                }
    
                    try {
                        copyDataBase();
                    } catch (IOException e) {
                        throw new Error("Error copying database");
                    }
                }
            }
    
       private static String DB_NAME = "dbtest.sqlite";
    
       private static String DB_NAME = "dbtest.db";
    
    public class DBHelper extends SQLiteOpenHelper {
        public int GetCursor;
        // ****************** Declare all the global variable
        // ****************************//
        private Context myContext;
        public String DB_PATH = "data/data/com.exasmple.dbexam/databases/"; // path
        // of
        // your
        // datbase
        public static String DB_NAME = "Test.sqlite";// your database name
        static String ASSETS_DB_FOLDER = "db";
        private SQLiteDatabase db;
    
        public DBHelper(Context context) {
            super(context, DB_NAME, null, 2);
            if (db != null && db.isOpen())
                close();
    
            this.myContext = context;
            //DB_NAME = db_name;
    
            try {
                createDataBase();
                openDataBase();
            } catch (IOException e) {
                // System.out.println("Exception in creation of database : "+
                // e.getMessage());
                e.printStackTrace();
            }
    
        }
    
        
    
        public void createDataBase() throws IOException {
            boolean dbExist = checkDataBase();
    
            if (dbExist) {
                // System.out.println("Database Exist");
            } else {
                this.getReadableDatabase();
    
                try {
                    copyDatabase();
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
            }
        }
    
        private void copyDatabase() throws IOException {
            InputStream input = myContext.getAssets().open(DB_NAME);
            String outputFileName = DB_PATH + DB_NAME;
            OutputStream output = new FileOutputStream(outputFileName);
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
    
            // Close the streams
            output.flush();
            output.close();
            input.close();
            // System.out.println(DB_NAME + "Database Copied !");
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public void openDataBase() throws SQLException {
            // Open the database
            String myPath = DB_PATH + DB_NAME;
            db = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }
    
        public boolean isOpen() {
            if (db != null)
                return db.isOpen();
            return false;
        }
    
        @Override
        public synchronized void close() {
            if (db != null)
                db.close();
            super.close();
        }
    
        private boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            try {
                String myPath = DB_PATH + DB_NAME;
                // System.out.println("My Pathe is:- " + myPath);
                // System.out.println("Open");
                checkDB = SQLiteDatabase.openDatabase(myPath, null,
                        SQLiteDatabase.OPEN_READWRITE);
                // System.out.println("checkDB value:" + checkDB);
                // System.out.println("My Pathe is:- " + myPath);
            } catch (Exception e) {
                // database does't exist yet.
            }
    
            if (checkDB != null) {
                // System.out.println("Closed");
                checkDB.close();
                // System.out.println("My db is:- " + checkDB.isOpen());
            }
    
            return checkDB != null ? true : false;
        }
    
        public Cursor execCursorQuery(String sql) {
            Cursor cursor = null;
            try {
                cursor = db.rawQuery(sql, null);
                GetCursor = cursor.getCount();
                Log.i("Inside execCursorQuery try", sql);
            } catch (Exception e) {
                Log.i("Inside execCursorQuery exception", e.getMessage());
            }
            return cursor;
        }
    
        public void execNonQuery(String sql) {
            try {
                db.execSQL(sql);
                // Log.d("SQL", sql);
            } catch (Exception e) {
                // Log.e("Err", e.getMessage());
            } finally {
                // closeDb();
            }
        }
    
        public ArrayList<String> GetchapterID(){
            String sql="";
                //System.out.println("Inside Database");
                sql="select distinct(ChapterId) from contents";
            
            ArrayList<String> list = new ArrayList<String>();
            Cursor cursor=db.rawQuery(sql, null);
            
            try{
            if(cursor != null){
            if (cursor.moveToFirst()) {
                do {
                    list.add(cursor.getString(0));
                }
                while (cursor.moveToNext());
            }
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
            }
         else
                Toast.makeText(myContext, "No values in DB", Toast.LENGTH_SHORT).show();
            }
            catch(Exception e){
                System.out.println("GetGradeNames(): " +e);
            }
            return list;
        }
    }