2013-08-18 54 views
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 

    }  

}

+0

提示:硬編碼路徑是壞了,拿到從上下文中的數據庫路徑:http://stackoverflow.com/a/9810553/995891 – zapl

回答

0

打開allwords.db, 和公正運行此查詢,

CREATE TABLE android_metadata (locale TEXT); 
+0

thnx到D這兩個你...它的工作lyk魔術....我簡單地創建D表在我的SQLite瀏覽器說,它工作..i'會改變d硬編碼 – user2694535

+0

@ user2694535高興地幫助你, 好吧...我想你可以投票了答案也是...;) –

+0

aw ... tot我確實......現在已經做到了;) – user2694535

0

數據庫必須有一個表叫android_metadata。如果以編程方式創建數據庫,則將自動生成此特殊表。

這個表應該有兩列:

rowid主鍵(整數)

locale = en_US爲文本(或其他區域設置代碼)。使用任何SQLite數據庫的揭幕戰在資產文件夾

Here is a tutorial that solves your problem