2011-09-23 157 views
3

我在sqlite数据库中遇到了问题。首先我在外部创建了数据库,然后将它放在资产文件夹中。以下代码复制数据库。Sqlite数据库问题android

public class DbH extends SQLiteOpenHelper{ 
    private Context mycontext; 

    private String DB_PATH = "/data/data/com.android.quotes/databases/"; 
    private static String ROW_ID="_id"; 
    private static String DB_NAME = "mdb1.db"; 
    public SQLiteDatabase myDataBase; 
    /*private String DB_PATH = "/data/data/" 
     + mycontext.getApplicationContext().getPackageName() 
     + "/databases/"; 
    */ 

    public DbH(Context context) throws IOException { 
     super(context,DB_NAME,null,1); 
     this.mycontext=context; 
     boolean dbexist = checkdatabase(); 
     if(dbexist){ 
      //System.out.println("Database exists"); 
      opendatabase(); 
     } else { 
      System.out.println("Database doesn't exist"); 
      createdatabase(); 
     } 
    } 

    public void createdatabase() throws IOException{ 
     boolean dbexist = checkdatabase(); 
     if(dbexist){ 
      System.out.println(" Database exists."); 
     } else { 
      this.getReadableDatabase(); 
      try{ 
       copydatabase(); 
      } catch(IOException e){ 
      throw new Error("Error copying database"); 
      } 
     } 
    } 

    private boolean checkdatabase() { 
     //SQLiteDatabase checkdb = null; 
     boolean checkdb = false; 
     try{ 
      String myPath = DB_PATH + DB_NAME; 
      File dbfile = new File(myPath); 
      SQLiteDatabase.openDatabase 
       (myPath,null,SQLiteDatabase.OPEN_READWRITE); 
      checkdb = dbfile.exists(); 
      } catch(SQLiteException e){ 
       System.out.println("Database doesn't exist"); 
      } 
      return checkdb; 
    } 

    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 byte to inputfile to 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_READWRITE 
     ); 
    } 

    public synchronized void close(){ 
     if(myDataBase != null){ 
      myDataBase.close(); 
     } 
     super.close(); 
    } 

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

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

} 

在主要活动中,我首先调用createdatabase,然后opendatabase。 现在我想在sqlite数据库中只有两个表一个是android_metadata,第二个是mTable.when我运行该程序时发生以下错误。

  1. 虽然创建的数据库,我可以使用它的文件资源管理器中的食,但只有android_metadata表是存在的,mTable是不是有看到。
  2. 所以它说,从mTable中选择*时不存在这样的表。

任何建议我哪里错了。我从一周之内拉我的头发。请帮忙。 在此先感谢。

+0

你得到这个问题的解决方案?我完全一样.... – Opiatefuchs

回答

0

首先检查数据库的数据库存在于内部存储如果不是复制

private void checkDatabase() { 

     StringBuffer dbPath = new StringBuffer(); 
     File databaseFile; 
     // Location of the database file, where it will be stored to access 
     // throughout the program. 
     dbPath.append("/data/data/"); 
     dbPath.append(getBaseContext().getPackageName()); 
     dbPath.append("/databases/"); 

     // Location of the database file stored in assets folder. 
     String storedDatabase = Constants.DATABASE_FILE_NAME; 

     // copy the database 
     try { 

      databaseFile = new File(dbPath.toString(), Constants.DATABASE_FILE_NAME); 

      if (databaseFile.exists()) { 
       Log.i("database", "database already Exists"); 

      } else { 
       SQLiteDatabase database = openOrCreateDatabase(Constants.DATABASE_FILE_NAME, 
         SQLiteDatabase.OPEN_READONLY, null); 
       database.close(); 
       copyDatasbase(getBaseContext().getAssets(), storedDatabase, 
         dbPath + Constants.DATABASE_FILE_NAME); 
      } 
     } catch (IOException ioException) { 

      ioException.printStackTrace(); 
     } catch (Exception exception) { 

      exception.printStackTrace(); 
     } 

    } 

如果数据库不存在,那么从资产复制到内部存储

private void copyDatasbase(AssetManager manager, String sourceFileName, 
      String destinationFileName) throws IOException { 

     // Read file from AccessManager 
     InputStream inputStream = manager.open(sourceFileName); 
     OutputStream outputStream = new FileOutputStream(destinationFileName); 
     Log.d("-->", "src: " + sourceFileName); 
     Log.d("-->", "Des: " + destinationFileName); 
     byte[] buffer = new byte[3072]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      // Write the database file to the folder "databases" 
      outputStream.write(buffer, 0, length); 

     } 

     outputStream.flush(); 
     outputStream.close(); 
     inputStream.close(); 

     outputStream = null; 
     inputStream = null; 
    }