需要帮助从资产文件夹复制数据

时间:2013-08-18 19:58:27

标签: android

我想使用下面提供的代码将资产文件夹中的外部数据库添加到我的应用程序中。当我在旧版本上运行应用程序时 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

    }    

}

2 个答案:

答案 0 :(得分:0)

您的数据库必须有一个名为android_metadata的表。如果以编程方式创建数据库,则会自动生成此特殊表。

此表应包含两列:

rowid您的主键(整数)

locale = en_US作为文字(或其他区域代码)。

Here is a tutorial that solves your problem

答案 1 :(得分:0)

使用任何sqlite数据库开启工具打开资产文件夹中的allwords.db, 并运行此查询,

CREATE TABLE android_metadata (locale TEXT);