1

以下に示すコードを使用して、アセット フォルダーからアプリケーションに外部データベースを追加したいと考えています。エミュレーターで Android の古いバージョン (Android 2.3.3 など) でアプリケーションを実行すると、次のエラーが表示されます: android.database.sqlite.SQLiteException: no such table: android_metadata しかし、コードは新しいバージョンで正常に動作します。

これはコードです:

public class MainDataBase extends SQLiteOpenHelper{

 private static String DB_PATH = "/data/data/com.nony.dictionary/databases/";

 private static String DB_NAME = "allwords.db";

 private String TABLE_NAME ="ENGLISH";

 private SQLiteDatabase myDataBase;

 private final Context myContext;

 public MainDataBase(Context context) {

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


 public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        if(dbExist){
            //do nothing - database already exist
        }else{

            //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.

            SQLiteDatabase db = this.getReadableDatabase();
            if (db.isOpen()){
            db.close();
            }
            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){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }


 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 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 ArrayList<HashMap<String,String>> getalldatas()
    {   
        String select=null;
        ArrayList<HashMap<String,String>> allContacts = new ArrayList<HashMap<String,String>> ();

           select ="SELECT * FROM "+TABLE_NAME  +" ORDER BY ENGWORD" ;


        SQLiteDatabase  data = this.getReadableDatabase();

        Cursor thecusor = data.rawQuery(select, null);

        if(thecusor.moveToFirst())
        {
            do{
                HashMap<String, String> createtheMap = new  HashMap<String, String> ();

                createtheMap.put("_ID", thecusor.getString(0));
                createtheMap.put("ENGWORD", thecusor.getString(1));
            //  Log.d("gggg", thecusor.getString(0)+thecusor.getString(1)+thecusor.getString(2));
                allContacts.add(createtheMap);

              }while(thecusor.moveToNext());
        }
        return  allContacts;
    }

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

    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }    

}

4

2 に答える 2

0

データベースには というテーブルが必要android_metadataです。プログラムでデータベースを作成すると、この特別なテーブルが自動的に生成されます。

このテーブルには次の 2 つの列が必要です。

rowid主キー (整数)

locale = en_USテキスト (または他のロケール コード) として。

ここにあなたの問題を解決するチュートリアルがあります

于 2013-08-18T20:13:02.287 に答える
0

sqlite データベース オープナーを使用してアセット フォルダーの allwords.db を開き、次のクエリを実行するだけです。

CREATE TABLE android_metadata (locale TEXT);
于 2013-08-18T20:13:37.897 に答える