简体   繁体   English

Sqlite数据库问题android

[英]Sqlite database problem android

I have a problem in sqlite database.First i created database externally and then put it in the assets folder.The following code copy the database. 我在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
    }

}

In main activity i first call createdatabase and then opendatabase. 在主要活动中,我首先调用createdatabase,然后调用opendatabase。 Now i craeted only two table in sqlite database one is android_metadata and second is mTable.when i run the program the following errors occur. 现在我只在sqlite数据库中创建了两个表,一个是android_metadata,第二个是mTable。当我运行程序时,发生以下错误。

  1. Although database is created and i can see it using file explorer in eclipse but only android_metadata table is there and mTable is not there. 虽然数据库是创建的,我可以在eclipse中使用文件浏览器看到它,但只有android_metadata表存在且mTable不存在。
  2. So it says no such table exists while selecting * from mTable. 所以它说从mTable中选择*时不存在这样的表。

Any suggestion where im going wrong. 任何我出错的建议。 I m pulling my hair from one week me. 我从一周开始拉我的头发。 Please help. 请帮忙。 Thanks in advance. 提前致谢。

First Of all check database database exists in internal storage if not than copy 首先检查数据库数据库是否存在于内部存储中,如果不是复制

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();
        }

    }

if database not exists then copy from asset to internal storage 如果数据库不存在则从资产复制到内部存储

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;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM