Android Sqlite数据库问题

Android Sqlite数据库问题,android,database,sqlite,Android,Database,Sqlite,我在sqlite数据库中遇到了一个问题。首先,我从外部创建了数据库,然后将其放在assets文件夹中。下面的代码复制了数据库 public class DbH extends SQLiteOpenHelper{ private Context mycontext; private String DB_PATH = "/data/data/com.android.quotes/databases/"; private static String ROW_ID="_id";

我在sqlite数据库中遇到了一个问题。首先,我从外部创建了数据库,然后将其放在assets文件夹中。下面的代码复制了数据库

public class DbH extends SQLiteOpenHelper{
    private Context mycontext;

    private String DB_PATH = "/data/data/com.android.quotes/databases/";
    private static String ROW_ID="_id";
    private static String DB_NAME = "mdb1.db";
    public SQLiteDatabase myDataBase;
    /*private String DB_PATH = "/data/data/"
        + mycontext.getApplicationContext().getPackageName()
        + "/databases/";
    */

    public DbH(Context context) throws IOException  {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if(dbexist){
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }

    public void createdatabase() throws IOException{
        boolean dbexist = checkdatabase();
        if(dbexist){
            System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try{
                copydatabase();
            } catch(IOException e){
            throw new Error("Error copying database");
            }
        }
    }

    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try{
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            SQLiteDatabase.openDatabase
               (myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
            } catch(SQLiteException e){
                System.out.println("Database doesn't exist");
            }
            return checkdb;
    }

    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);

        // Path to the just created empty db
       String outfilename = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream(outfilename);

        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0){
            myoutput.write(buffer,0,length);
        }
        //Close the streams
        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_READWRITE
        );
    }

    public synchronized void close(){
        if(myDataBase != null){
            myDataBase.close();
        }
        super.close();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Empty
    }

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

}
在主活动中,我首先调用createdatabase,然后调用opendatabase。 现在我在sqlite数据库中只列出了两个表,一个是android_元数据,第二个是mTable

  • 虽然数据库是创建的,我可以在eclipse中使用文件资源管理器看到它,但只有android_元数据表在那个里,而mTable不在那个里
  • 因此,在从mTable中选择*时,它表示不存在这样的表
  • 任何关于我哪里出错的建议。我从一周前就开始抽头发了。请帮忙。
    提前感谢。

    首先检查数据库是否存在于内部存储器中,如果不存在,请复制

    private void checkDatabase() {
    
            StringBuffer dbPath = new StringBuffer();
            File databaseFile;
            // Location of the database file, where it will be stored to access
            // throughout the program.
            dbPath.append("/data/data/");
            dbPath.append(getBaseContext().getPackageName());
            dbPath.append("/databases/");
    
            // Location of the database file stored in assets folder.
            String storedDatabase = Constants.DATABASE_FILE_NAME;
    
            // copy the database
            try {
    
                databaseFile = new File(dbPath.toString(), Constants.DATABASE_FILE_NAME);
    
                if (databaseFile.exists()) {
                    Log.i("database", "database already Exists");
    
                } else {
                    SQLiteDatabase database = openOrCreateDatabase(Constants.DATABASE_FILE_NAME,
                            SQLiteDatabase.OPEN_READONLY, null);
                    database.close();
                    copyDatasbase(getBaseContext().getAssets(), storedDatabase,
                            dbPath + Constants.DATABASE_FILE_NAME);
                }
            } catch (IOException ioException) {
    
                ioException.printStackTrace();
            } catch (Exception exception) {
    
                exception.printStackTrace();
            }
    
        }
    
    如果数据库不存在,则从资产复制到内部存储

    private void copyDatasbase(AssetManager manager, String sourceFileName,
                String destinationFileName) throws IOException {
    
            // Read file from AccessManager
            InputStream inputStream = manager.open(sourceFileName);
            OutputStream outputStream = new FileOutputStream(destinationFileName);
            Log.d("-->", "src: " + sourceFileName);
            Log.d("-->", "Des: " + destinationFileName);
            byte[] buffer = new byte[3072];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                // Write the database file to the folder "databases"
                outputStream.write(buffer, 0, length);
    
            }
    
            outputStream.flush();
            outputStream.close();
            inputStream.close();
    
            outputStream = null;
            inputStream = null;
        }
    

    你找到这个问题的解决办法了吗?我得到了完全一样的。。。。