1

I want to add an external database from my asset folder to my application with the code provided below. When I run the application on an older version of android (such as android 2.3.3) on the emulator I receive this error: android.database.sqlite.SQLiteException: no such table: android_metadata but the code works well on newer versions.

This is the code:

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

    }    

}

Gidil
  • 4,137
  • 2
  • 34
  • 50
  • hint: hardcoded paths are bad, get the database path from context: http://stackoverflow.com/a/9810553/995891 – zapl Aug 18 '13 at 21:55

2 Answers2

0

Your database must have a table called android_metadata. If you create your database programmatically, this special table will be generated automatically.

This table should have two columns:

rowid your primary key (integer)

locale = en_US as text (or an other locale code).

Here is a tutorial that solves your problem

Namenlos
  • 1,615
  • 2
  • 18
  • 24
0

Open your allwords.db in your asset folder using any sqlite database opener, and just run this query,

CREATE TABLE android_metadata (locale TEXT);
Jaldip Katre
  • 3,216
  • 1
  • 19
  • 14
  • thnx to d both of u...it worked lyk magic....i simply created d table on my sqlite browser as said and it worked ..i'll change d hardcoding too – user2694535 Aug 19 '13 at 15:11
  • @user2694535 Happy to help you, Well...I think you can up vote the answers too... ;) – Jaldip Katre Aug 20 '13 at 09:32