3

デバイスのデータフォルダにアクセスするには、ルート化する必要があることを知っています。ただし、データベースをアセットフォルダーからデバイスのデータフォルダーにコピーしたいだけの場合、コピープロセスはルート化されていない電話で機能しますか?以下は私のデータベースヘルパークラスです。logcatから、copyDataBase()、createDataBase()、およびopenDataBase()へのメソッド呼び出しが正常に返されることを確認できます。しかし、私はこのエラーメッセージを受け取りました

android.database.sqlite.SQLiteException:そのようなテーブルはありません:TABLE_NAME:

アプリケーションがrawQueryを実行しているとき。データベースファイルが正常にコピーされていないのではないかと思いますが(データフォルダーにアクセスできないため、確信が持てません)、copyDatabase()のメソッド呼び出しで例外がスローされていません。どうなり得るか?ありがとう。

ps:私のデバイスはまだルート化されていません。それがエラーの主な原因ではないことを願っています。

public DatabaseHelper(Context context) {

        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }   

 public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        String s = new Boolean(dbExist).toString();
        Log.d("dbExist", s );

        if(dbExist){
            //do nothing - database already exist
            Log.d("createdatabase","DB exists so do nothing");
        }else{


        this.getReadableDatabase();

            try {

                copyDataBase();
                Log.d("copydatabase","Successful return frm method call!");

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }


    private boolean checkDataBase(){

        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
            }


    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = null;


            myInput = myContext.getAssets().open(DB_NAME);


            Log.d("copydatabase","InputStream successful!");


        // 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 bytes from the inputfile to the 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_READONLY);

    }

/*    @Override
    public synchronized void close() {

            if(myDataBase != null)
                myDataBase.close();

            super.close();

    }*/

    public void close() {
        // NOTE: openHelper must now be a member of CallDataHelper;
        // you currently have it as a local in your constructor
        if (myDataBase != null) {
            myDataBase.close();
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }



}
4

1 に答える 1

0

DB_NAMEは、assestsフォルダーにあるデータベースと同じではないと思います。

フォローしている場合は、次reigndesignの行を確認してください。

private static String DB_NAME ="myDBName";  

ここでのDB_NAMEは、データベースの名前です。アセットフォルダにデータベースのコピーがあることを前提としています。DB_NAMEは、アセットフォルダーに存在するものと同じである必要があります。

また

これに従ってください。

于 2012-10-09T04:33:43.343 に答える